.htaccess | mod_rewrite verhält sich merkwürdig
Martin Hein
- webserver
0 frankx0 Cheatah0 Martin Hein0 ChrisB0 Martin Hein0 ChrisB
Hallo Forum,
ich habe in einer .htaccess diverse RewriteRules definiert, die
auf meinem xampp funktionieren, sich aber auf dem Live-Server
anders verhalten. Ich kann es mir nicht erklären !
.htaccess
---------------------------------------------------------------------
Options +FollowSymLinks
Options -Indexes
ErrorDocument 404 /_content/index.php
RewriteEngine On
RewriteBase /
RewriteRule ^([^_]).+/$ /_content/index.php?%{QUERY_STRING}
RewriteCond %{SERVER_NAME} !^dcbkk(.*)
#... werden nach daimlerchryslerbkk.de umgeleitet
RewriteRule (.*) http://www.daimlerchryslerbkk.de/
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{REQUEST_URI} !/_admin/
RewriteCond %{REQUEST_URI} !(.*).css$
RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI}
RewriteRule ^$ /_content/?site_id=1&%{QUERY_STRING}
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{REQUEST_URI} /_admin/
RewriteRule (.*) http://%{SERVER_NAME}%{REQUEST_URI}
---------------------------------------------------------------------
Die Datei ist gewachsen und sicherlich lässt sie sich optimieren.
Aber auf meinem System macht sie das, was sie soll. Auf dem
Liveserver verhält sie sich anders:
Unterschiedlich ist der Umgang mit # 2). Das ist die letzte Regel,
die ich eingeführt habe. Ich hätte sie eigentlich ganz als erstes
definiert (in der Erwartung, dass dann keine anderen Regeln mehr
gelesen werden). Aber dem ist nicht so:
Steht sie ganz oben greift immernoch die Umleitung nach https
und dann zeigt der Browser mir eine 302 an.
Steht sie an Position 2) funktioniert alles, wie gewünscht:
alle Aufrufe mit !'dcbkk' werden umgeleitet. In der Adresszeile
steht die Adresse, wohin die Umleitung gegangen ist.
Auf dem Liveserver wird trotz Umleitung die eingegebene Adresse
und es wird ein jedem Fall nach https umgeleitet.
Sorry, ich arbeite zum ersten mal mit mod_rewrite und darin sind
möglicherweise logische Fehler. Aber bei mir macht sie, was sie
soll. auf dem Liveserver nicht.
kann mir jemand helfen ?
tausen Dank und
beste gruesse,
martin
Hellihello Martin,
mage es sein, dass Du noch ein "Flag" setzen kannst, irgendein Großbuchstabe wie "L", damit dann nach der jeweiligen Condition auch "Schluss" ist. Sonst läuft er von einer zur nächsten, die dann ja immer noch "matchen".
Dank und Gruß,
frankx
Hallo frankx,
right, das mit dem Flag war ein Supertipp ! tausend Dank !!!
Ich habe die Regeln jetzt so umsortieren können, wie die
Reihenfolge logisch ist, indem ich mit [L] ein weiterlesen
jeweils explizit unterbunden habe.
.htaccess
---------------------------------------------------------------
Options +FollowSymLinks
Options -Indexes
ErrorDocument 404 /_content/index.php
RewriteEngine On
RewriteBase /
RewriteCond %{SERVER_NAME} !^dcbkk(.*)
#... werden nach daimlerchryslerbkk.de umgeleitet
RewriteRule ^(.*) http://www.daimlerchryslerbkk.de/ [L]
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{REQUEST_URI} !/_admin/
RewriteCond %{REQUEST_URI} !(.*).css$
RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI} [L]
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{REQUEST_URI} /_admin/
RewriteRule (.*) http://%{SERVER_NAME}%{REQUEST_URI} [L]
RewriteRule ^([^_]).+/$ /_content/index.php?%{QUERY_STRING}
RewriteRule ^$ /_content/?site_id=1&%{QUERY_STRING}
---------------------------------------------------------------
das Einzige wo es nicht ganz richtig funktioniert, ist folgendes:
Bei der Eingabe von https scheint er weiterzulesen. Dann werde
ich zwar weitergeleitet, aber in der Adresszeile steht noch
was ich eingegeben habe. Wenn ich das ganze mit http mache, ändert
sich auch die Adresszeile.
beste gruesse,
martin
Hi,
2) Alle Anfragen die nicht mit 'dcbkk' beginnen ...
RewriteCond %{SERVER_NAME} !^dcbkk(.*)
#... werden nach daimlerchryslerbkk.de umgeleitet
RewriteRule (.*) http://www.daimlerchryslerbkk.de/
dies ist ein externer Redirect. Betrachte ihn so, als hätte der User per Hand diese Adresse in seinen Browser eingegeben.
3) Alle Anfragen mit http (ausser auf /_admin/ und css-files) werden auf https umgeleitet
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{REQUEST_URI} !/_admin/
RewriteCond %{REQUEST_URI} !(.*).css$
RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI}
Würde in dem Fall diese Umleitung greifen?
Cheatah
Hi,
dies ist ein externer Redirect. Betrachte ihn so, als hätte der User per Hand diese Adresse in seinen Browser eingegeben.
ja, genauso ist er auch gedacht: Umleitung im zutreffenden Fall.
Nach der Umleitung sollte nichts mehr passieren, weil ja schon
umgeleitet ist
Würde in dem Fall diese Umleitung greifen?
Die Umleitung sollte nach der ersten Regel bereits erfolgt sein
und daher allefolgenden nicht mehr beachtet werden.
beste gruesse,
martin
Hi,
dies ist ein externer Redirect. Betrachte ihn so, als hätte der User per Hand diese Adresse in seinen Browser eingegeben.
ja, genauso ist er auch gedacht: Umleitung im zutreffenden Fall.
Nach der Umleitung sollte nichts mehr passieren, weil ja schon
umgeleitet istWürde in dem Fall diese Umleitung greifen?
Die Umleitung sollte nach der ersten Regel bereits erfolgt sein
und daher allefolgenden nicht mehr beachtet werden.
Du hast den Einwand nicht verstanden.
Was passiert beim Redirect? Es kommt ein komplett neuer Request vom Client.
Und was passiert mit eingehenden Requests? Genau, sie durchlaufen deine kompletten RewriteRules.
MfG ChrisB
Hi,
Du hast den Einwand nicht verstanden.
offensichtlich nicht.
Was passiert beim Redirect? Es kommt ein komplett neuer Request vom Client.
ganz genau so ist es auch gedacht.
Und was passiert mit eingehenden Requests? Genau, sie durchlaufen deine kompletten RewriteRules.
und genau da ist mein Verständnisproblem:
warum ist der Request "engehend" ? Bzw. sicher ist er das,
aber ganz wo anders. Nämlich da, wohin er umgeleitet wurde.
besten dank für Klärung und
viele gruesse,
martin
Hi,
Und was passiert mit eingehenden Requests? Genau, sie durchlaufen deine kompletten RewriteRules.
und genau da ist mein Verständnisproblem:
warum ist der Request "engehend" ?
Mit einem Redirect-Header sagst du dem Client, "bitte schau woanders nach, frag nach der Adresse XYZ".
Wo ist jetzt der Unterschied dazu, ob der Client gleich XYZ angefordert haette? Genau, es gibt absolut keinen.
MfG ChrisB