mod_rewrite: Kommt der Besucher (nicht) von der eigenen Domain?
Published 2005-10-22, 20:14
Hin und wieder ist es ganz nützlich per mod_rewrite überprüfen zu können ob ein Nutzer zuvor schon eine Seite auf dem selben Server aufgerufen hat, oder eben nicht. Normalerweise macht man hier eine einfache Überprüfung:
RewriteCond %{HTTP_REFERER} ^(http://|https://)(www\.)?domain\.de(.*)$ [NC]
Diese Version hat den klaren Nachteil, dass man den Domainnamen fest in die .htaccess einbauen muss. Da ich genau eine solche Überprüfung nun für CommentsTrack light gebastelt habe und die Datei hier ja bereitgestellt werden soll brauchte ich eine andere Lösung – die Überprüfung muss anhand des Host-Headers der beim Aufruf gesendet wird stattfinden.
Grandios geholfen hat mir dabei Robert alias Caterham in einem Thread bei Abakus. Er hat zwar eine falsche Lösung gepostet, doch die hat mir dann den Denkanstoß für die funktionierende Version gegeben:
Im Pattern der Condition hat man keinen Zugriff auf irgendwelche Servervariabeln oder irgendwas anderes – es sind fast nur pure Ausdrücke möglich. Um also einen Vergleich basteln zu können muss man über einige Trickserei den Host-Header erst in das Pattern bringt und dann mit dem Referer vergleichen:
RewriteCond %{HTTP_HOST}<>%{HTTP_REFERER} ^(.+)<>https?://\1(.*)$ [NC]
Nehmen wir also an:
Referer: http://domain.de/referer.htm
Host: domain.de
ergibt sich daraus folgender Vergleich:
RewriteCond domain.de<>http://domain.de/referer.htm ^domain.de<>http://domain.de/referer.htm$ [NC]
Und da dies zutrifft, ist diese Rewriterule dafür geeignet zu übeprüfen ob der Referer vom selben Host ist wie die jetzt angeforderte Datei.
Für CommentsTrack light muss ich das ganze übrigens negieren, da ja eben gerade Aufrufe mit Referer vom selben Host nicht berücksichtigt werden sollen. Einfach ein Ausrufezeichen vor das Pattern und fertig.
[Update] Damit auch Verlinkungen von domain.de/referer.htm nach www.domain.de erkannt werden noch 2 kleine Änderungen:
RewriteCond %{HTTP_HOST}<>%{HTTP_REFERER} ^(www\.)?(.+)<>https?://(www\.)?\2(.*)$ [NC]
Zum Artikel mod_rewrite: Kommt der Besucher (nicht) von der eigenen Domain? sind noch keine Kommentare vorhanden. Deine Meinung wäre jedoch willkommen!