Seite 1 von 1

Cookie & mod_rewrite

Verfasst: 21.10.2005, 17:16
von Southmedia
Ich spiele momentan an einem kleinen Script herum, CommentsTrack light, das es Blognutzern erleichtern soll die eigenen Kommentare in anderen Blogs besser zu verfolgen (mehr Infos hier: https://betamode.de/index.php?s=commentstrack).

Dazu setzt der Domainbesitzer bei sich ein Cookie "owner" mit dem Wert 1 damit er vom Script erkannt werden kann. Kommt er nun von einer anderen Domain auf seine eigene, soll er auf eine bestimmte Datei umgeleitet werden.

Meine mod_rewrite soll nun alle Nutzer die
[1.] dieses Cookie haben,
[2.] die Startseite aufrufen,
[3.] nicht die Domain selbst als Referer
[4.] oder gar keinen Referer haben
[5.] auf die Datei commentstrack.php umleiten.

Ich habe dies in folgenden "Code" umgesetzt, der auch funktioniert:

Code: Alles auswählen

RewriteCond %{HTTP_COOKIE} .*owner=1.*
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{HTTP_REFERER} !HTTP_HOST
RewriteCond %{HTTP_REFERER} !^$
RewriteRule ^(.*)$ /commentstrack.php [L]
Meine Frage ist nun einfach ob man die Syntax noch verbessern kann - ich bin da nicht so der Held... Kann jemand helfen?

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Cookie & mod_rewrite

Verfasst: 22.10.2005, 13:30
von Caterham
Hi,

nutzt du den Code in einer .hatccess oder in der httpd.conf?

%{REQUEST_URI} ^/$ kannst du besser im Pattern der RewriteRule unterbringen, dieser wird vor den Conditions geprüft. Bei (.*) würde jeder Request zuerst dort reinlaufen und dann an den Conditions scheitern

[3.] nicht die Domain selbst als Referer
Die 1. Referer-Cond. besagt, dass die Zeichenkette HTTP_HOST nicht im Referer vorkommen darf. ENVs sind hier (im rechten Teil der Condition) nicht verfügbar. Entweder wird der Host notiert
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain\.de
oder du nutzt
RewriteCond %{HTTP_REFERER}<>%{HTTP_HOST} !^(.+)<>\1
.htaccess

Code: Alles auswählen

RewriteCond %&#123;HTTP_COOKIE&#125; .*owner=1.*
RewriteCond %&#123;HTTP_REFERER&#125;<>%&#123;HTTP_HOST&#125; !^&#40;.+&#41;<>\1
RewriteCond %&#123;HTTP_REFERER&#125; !^$
RewriteRule ^$ /commentstrack.php &#91;L&#93;

httpd.conf (einziger unterschied ist der führende Slash im Pattern der RewriteRule):

Code: Alles auswählen

RewriteCond %&#123;HTTP_COOKIE&#125; .*owner=1.*
RewriteCond %&#123;HTTP_REFERER&#125;<>%&#123;HTTP_HOST&#125; !^&#40;.+&#41;<>\1
RewriteCond %&#123;HTTP_REFERER&#125; !^$
RewriteRule ^/$ /commentstrack.php &#91;L&#93;
Grüße
Robert

Cookie & mod_rewrite

Verfasst: 22.10.2005, 14:09
von Southmedia
Danke Robert,

das ganze wird wohl mehrheitlich in der .htaccess genutzt werden - aber auch nicht schlecht was ich tun muss wenn es denn ma in die httpd.conf soll.
%{REQUEST_URI} ^/$ kannst du besser im Pattern der RewriteRule unterbringen, dieser wird vor den Conditions geprüft. Bei (.*) würde jeder Request zuerst dort reinlaufen und dann an den Conditions scheitern
Okay, ich dachte bisher dass die Rule überhaupt erst angeschaut wird wenn die Conditions erfüllt sind. Wenn dann weitere URLs dazukommen bei denen das Script greifen soll, lässt es sich so auch schöner durch eine weitere Rewrite-Rule erweitern, oder?
Die 1. Referer-Cond. besagt, dass die Zeichenkette HTTP_HOST nicht im Referer vorkommen darf. ENVs sind hier (im rechten Teil der Condition) nicht verfügbar.
Bist du dir da absolut sicher? Da meine Server gerade down sind *hüstel* auf denen ich die ganzen Sachen liegen habe kann ich leider nicht rumprobiern, aber eigentlich dachte ich gestern dass er damit Referer vom eigenen Host ausgeschlossen hätte...

Code: Alles auswählen

RewriteCond %&#123;HTTP_REFERER&#125;<>%&#123;HTTP_HOST&#125; !^&#40;.+&#41;<>\1
Könntest du das ein wenig erklären?

Cookie & mod_rewrite

Verfasst: 22.10.2005, 15:12
von Caterham
? Da meine Server gerade down sind *hüstel*
hm ja... Hauptswitchausfall bei Lambdanet :-/
Wenn dann weitere URLs dazukommen bei denen das Script greifen soll, lässt es sich so auch schöner durch eine weitere Rewrite-Rule erweitern, oder?
Da bietet sich es oft an, die RegEx zu ändern, also aus ^$ wird dann z.B.
^$|^abc
, was sowohl den "root-request" abfängt als auch den filepath, der mit abc beginnt.
Die 1. Referer-Cond. besagt, dass die Zeichenkette HTTP_HOST nicht im Referer vorkommen darf. ENVs sind hier (im rechten Teil der Condition) nicht verfügbar.
Bist du dir da absolut sicher?
Ja, da ich es schon einmal selbst versuchen wollte. Sowohl der Pattern der RewriteRule als auch der Pattern der Condition lassen nur RegEx-Ausdrücke zu. (selbst wenn es gehen würde, müsstest du die ENV in %{...} "einkleiden".
RewriteCond %{HTTP_REFERER}<>%{HTTP_HOST} !^(.+)<>\1
Könntest du das ein wenig erklären?
Die Cond. vergleicht beide Strings. Im Teststring werden %{HTTP_REFERER} und %{HTTP_HOST} "zu einem Teststring" verschmolzen, getrennt durch <> (man könnte auch &&& oder sonstwas als Trenner verwenden, das hat nichts mit Ungleich zu tun). Im Pattern wird dann der teststring geprüft. In der Gruppe ist dann alles bis zu den Zeichen <> enthalten, also der Wert der ENV %{HTTP_REFERER}. \1 ist eine RegEx interne backreference und enthält den Wert aus der Gruppe, also den Referer.

"Aufgelöst" sieht das dann so aus:
Fett hervorgehoben ist der Teil, der aus %{HTTP_HOST} "matched". Da das Ende der Zeichenkette durch $ nicht markiert wurde, reicht hier der Teilmatch. Zugegeben, das Konstrukt ist ein wenig komplex...

Re: Cookie & mod_rewrite

Verfasst: 22.10.2005, 17:43
von Southmedia
Caterham hat geschrieben:
RewriteCond %{HTTP_REFERER}<>%{HTTP_HOST} !^(.+)<>\1
Könntest du das ein wenig erklären?
Die Cond. vergleicht beide Strings. Im Teststring werden %{HTTP_REFERER} und %{HTTP_HOST} "zu einem Teststring" verschmolzen, getrennt durch <> (man könnte auch &&& oder sonstwas als Trenner verwenden, das hat nichts mit Ungleich zu tun). Im Pattern wird dann der teststring geprüft. In der Gruppe ist dann alles bis zu den Zeichen <> enthalten, also der Wert der ENV %{HTTP_REFERER}. \1 ist eine RegEx interne backreference und enthält den Wert aus der Gruppe, also den Referer.

"Aufgelöst" sieht das dann so aus:
Fett hervorgehoben ist der Teil, der aus %{HTTP_HOST} "matched". Da das Ende der Zeichenkette durch $ nicht markiert wurde, reicht hier der Teilmatch. Zugegeben, das Konstrukt ist ein wenig komplex...
Kann es sein das das nicht ganz funktioniert? %{HTTP_HOST} hat ja kein http:// dabei.

Das lässt sich ja noch durch ein einfaches

Code: Alles auswählen

RewriteCond %&#123;HTTP_REFERER&#125;<>http&#58;//%&#123;HTTP_HOST&#125; !^&#40;.+&#41;<>\1

beheben - nun kriegen wir wirklich den Vergleich den du oben geschrieben hast:
Nur das funktioniert ja auch überhaupt nicht, der String ist kürzer als das Pattern - das kann doch gar nicht funktionieren, oder?

Cookie & mod_rewrite

Verfasst: 22.10.2005, 18:56
von Southmedia
So also ich hab es nun ausprobiert, es funktioniert tatsächlich nicht.

Ich hab allerdings nun noch ziemlich lange dran rumgespielt und folgendes rausbekommen:

Code: Alles auswählen

RewriteCond http&#58;//%&#123;HTTP_HOST&#125;<>%&#123;HTTP_REFERER&#125; !^&#40;.+&#41;&#40;<>&#41;\1
Das wird dann "umgeschrieben" zu
RewriteCond https://domain.de<>https://domain.de/herkunftsdateidatei/ !^https://domain.de<>https://domain.de
und das passt weil der String länger ist als das Pattern.

Kannst du mir folgen Robert, und vor allem hab ich Recht?

Cookie & mod_rewrite

Verfasst: 22.10.2005, 19:21
von Caterham
und vor allem hab ich Recht?
Ja, genau so rum muss das, sorry, kleiner Denkfehler. Bei mir erledigt das Auseinanderschnipseln eine weitere Condition darüber, da ich bei mir einen Teil aus dem Pattern der Rule mit einem Teil einer ENV abgleiche.

Dir Gruppe um <> im Pattern kannst du noch entfernen ;)

Cookie & mod_rewrite

Verfasst: 22.10.2005, 19:22
von Southmedia
Im Blog mal zusammengefasst:
https://betamode.de/2005/10/22/mod_rewr ... en-domain/

Die Gruppe war übrigens ein Überbleibsel vom Debugging...

Nochmal ein kleines Update um auch den unwahrscheinlichen Fall einer Abfrage über https:// und unterschiede in der Groß-Klein-Schreibung der Domains abzufangen:

Code: Alles auswählen

RewriteCond %&#123;HTTP_HOST&#125;<>%&#123;HTTP_REFERER&#125; ^&#40;.+&#41;<>&#40;http&#58;//|https&#58;//&#41;?\1&#40;.*&#41;$ &#91;NC&#93;
Ich hoffe ich hab das richtig eingebaut...

Letzte verbleibende Unsicherheit ist nun wenn jemand von www.domain.de auf domain.de linkt oder andersrum. Aber ehrlich gesagt ist mir das dann doch ein wenig zu blöd - selbst schuld wer sowas macht.

Viel gelernt über mod_rewrite heute - danke dir!

Cookie & mod_rewrite

Verfasst: 22.10.2005, 19:59
von Caterham
Statt
(https://|httpss://)?
kannst du auch einfach

Code: Alles auswählen

https?&#58;//
verwenden.

Grüße
Robert

Cookie & mod_rewrite

Verfasst: 22.10.2005, 20:06
von Southmedia
Wow, stimmt.

Machst du mod_rewrite eigentlich hauptberuflich oder so?

Cookie & mod_rewrite

Verfasst: 22.10.2005, 20:13
von Caterham
Nein, "hauptberuflich studiere" ich Dt. u. Europ. Wirtschaftsrecht an der Uni Siegen.
Mit der Zeit sammelt(e) sich bei mir immer mehr Apache-Wissen an, natürlich auch gefördert durch meine Moderatorentätigkeit auf modrewrite.de

Du kannst ja mal testen, ob das mit dem www und nicht www so funktioniert:

Code: Alles auswählen

RewriteCond %&#123;HTTP_HOST&#125;<>%&#123;HTTP_REFERER&#125; ^&#40;www\.&#41;?&#40;.+&#41;<>https?&#58;//&#40;www\.&#41;?\2&#40;.*&#41;$ &#91;NC&#93;

Re: Cookie & mod_rewrite

Verfasst: 22.10.2005, 20:23
von Southmedia
Caterham hat geschrieben:natürlich auch gefördert durch meine Moderatorentätigkeit auf modrewrite.de
Ach okay, ich hatte schon überlegt ob ich mich da nicht auch anmelden sollten...
Du kannst ja mal testen, ob das mit dem www und nicht www so funktioniert:

Code: Alles auswählen

RewriteCond %&#123;HTTP_HOST&#125;<>%&#123;HTTP_REFERER&#125; ^&#40;www\.&#41;?&#40;.+&#41;<>https?&#58;//&#40;www\.&#41;?\2&#40;.*&#41;$ &#91;NC&#93;
Natürlich funktioniert das ;) Ich hatte gar nicht dran gedacht, dass ich dem (.+) das www. ja quasi wegnehmen kann wenn ich möchte. Perfekt.