| Autor |
Nachricht |
Southmedia Community-Manager

Anmeldungsdatum: 20.07.2003 Beiträge: 7302 Wohnort: Karlsruhe
|
Verfasst am: 21.10.2005, 18:16 Titel: Cookie & mod_rewrite |
 |
|
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: http://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: |
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? _________________ Community-Management Abakus-Forum |
|
| Nach oben |
|
 |
Caterham PostRank 5

Anmeldungsdatum: 20.09.2004 Beiträge: 331
|
Verfasst am: 22.10.2005, 14:30 Titel: Cookie & mod_rewrite |
 |
|
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
| Zitat: |
| [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
| Zitat: |
| RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain\.de |
oder du nutzt
| Zitat: |
| RewriteCond %{HTTP_REFERER}<>%{HTTP_HOST} !^(.+)<>\1 |
.htaccess
| Code: |
RewriteCond %{HTTP_COOKIE} .*owner=1.*
RewriteCond %{HTTP_REFERER}<>%{HTTP_HOST} !^(.+)<>\1
RewriteCond %{HTTP_REFERER} !^$
RewriteRule ^$ /commentstrack.php [L] |
httpd.conf (einziger unterschied ist der führende Slash im Pattern der RewriteRule):
| Code: |
RewriteCond %{HTTP_COOKIE} .*owner=1.*
RewriteCond %{HTTP_REFERER}<>%{HTTP_HOST} !^(.+)<>\1
RewriteCond %{HTTP_REFERER} !^$
RewriteRule ^/$ /commentstrack.php [L] |
Grüße
Robert |
|
| Nach oben |
|
 |
Southmedia Community-Manager

Anmeldungsdatum: 20.07.2003 Beiträge: 7302 Wohnort: Karlsruhe
|
Verfasst am: 22.10.2005, 15:09 Titel: Cookie & mod_rewrite |
 |
|
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.
| Zitat: |
| %{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?
| Zitat: |
| 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: |
| RewriteCond %{HTTP_REFERER}<>%{HTTP_HOST} !^(.+)<>\1 |
Könntest du das ein wenig erklären? _________________ Community-Management Abakus-Forum |
|
| Nach oben |
|
 |
Caterham PostRank 5

Anmeldungsdatum: 20.09.2004 Beiträge: 331
|
Verfasst am: 22.10.2005, 16:12 Titel: Cookie & mod_rewrite |
 |
|
| Zitat: |
| ? Da meine Server gerade down sind *hüstel* |
hm ja... Hauptswitchausfall bei Lambdanet :-/
| Zitat: |
| 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.
, was sowohl den "root-request" abfängt als auch den filepath, der mit abc beginnt.
| Zitat: |
| Zitat: |
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".
| Zitat: |
| Zitat: |
| 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... |
|
| Nach oben |
|
 |
Southmedia Community-Manager

Anmeldungsdatum: 20.07.2003 Beiträge: 7302 Wohnort: Karlsruhe
|
Verfasst am: 22.10.2005, 18:43 Titel: Re: Cookie & mod_rewrite |
 |
|
| Caterham hat Folgendes geschrieben: |
| Zitat: |
| Zitat: |
| 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: |
| RewriteCond %{HTTP_REFERER}<>http://%{HTTP_HOST} !^(.+)<>\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? _________________ Community-Management Abakus-Forum
Zuletzt bearbeitet von Southmedia am 22.10.2005, 19:58, insgesamt einmal bearbeitet |
|
| Nach oben |
|
 |
Southmedia Community-Manager

Anmeldungsdatum: 20.07.2003 Beiträge: 7302 Wohnort: Karlsruhe
|
Verfasst am: 22.10.2005, 19:56 Titel: Cookie & mod_rewrite |
 |
|
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: |
| RewriteCond http://%{HTTP_HOST}<>%{HTTP_REFERER} !^(.+)(<>)\1 |
Das wird dann "umgeschrieben" zu
und das passt weil der String länger ist als das Pattern.
Kannst du mir folgen Robert, und vor allem hab ich Recht? _________________ Community-Management Abakus-Forum |
|
| Nach oben |
|
 |
Caterham PostRank 5

Anmeldungsdatum: 20.09.2004 Beiträge: 331
|
Verfasst am: 22.10.2005, 20:21 Titel: Cookie & mod_rewrite |
 |
|
| Zitat: |
| 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  |
|
| Nach oben |
|
 |
Southmedia Community-Manager

Anmeldungsdatum: 20.07.2003 Beiträge: 7302 Wohnort: Karlsruhe
|
Verfasst am: 22.10.2005, 20:22 Titel: Cookie & mod_rewrite |
 |
|
Im Blog mal zusammengefasst:
http://betamode.de/2005/10/22/mod_rewrite-kommt-der-besucher-nicht-von-der-eigenen-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: |
| RewriteCond %{HTTP_HOST}<>%{HTTP_REFERER} ^(.+)<>(http://|https://)?\1(.*)$ [NC] |
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! _________________ Community-Management Abakus-Forum |
|
| Nach oben |
|
 |
Caterham PostRank 5

Anmeldungsdatum: 20.09.2004 Beiträge: 331
|
Verfasst am: 22.10.2005, 20:59 Titel: Cookie & mod_rewrite |
 |
|
Statt
| Zitat: |
| (http://|https://)? |
kannst du auch einfach
verwenden.
Grüße
Robert |
|
| Nach oben |
|
 |
Southmedia Community-Manager

Anmeldungsdatum: 20.07.2003 Beiträge: 7302 Wohnort: Karlsruhe
|
Verfasst am: 22.10.2005, 21:06 Titel: Cookie & mod_rewrite |
 |
|
Wow, stimmt.
Machst du mod_rewrite eigentlich hauptberuflich oder so? _________________ Community-Management Abakus-Forum |
|
| Nach oben |
|
 |
Caterham PostRank 5

Anmeldungsdatum: 20.09.2004 Beiträge: 331
|
Verfasst am: 22.10.2005, 21:13 Titel: Cookie & mod_rewrite |
 |
|
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: |
| RewriteCond %{HTTP_HOST}<>%{HTTP_REFERER} ^(www\.)?(.+)<>https?://(www\.)?\2(.*)$ [NC] |
|
|
| Nach oben |
|
 |
Southmedia Community-Manager

Anmeldungsdatum: 20.07.2003 Beiträge: 7302 Wohnort: Karlsruhe
|
Verfasst am: 22.10.2005, 21:23 Titel: Re: Cookie & mod_rewrite |
 |
|
| Caterham hat Folgendes 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...
| Zitat: |
Du kannst ja mal testen, ob das mit dem www und nicht www so funktioniert:
| Code: |
| RewriteCond %{HTTP_HOST}<>%{HTTP_REFERER} ^(www\.)?(.+)<>https?://(www\.)?\2(.*)$ [NC] |
|
Natürlich funktioniert das Ich hatte gar nicht dran gedacht, dass ich dem (.+) das www. ja quasi wegnehmen kann wenn ich möchte. Perfekt. _________________ Community-Management Abakus-Forum |
|
| Nach oben |
|
 |
|