mod_rewrite: debugging
Paul Brunner
- webserver
Hallo,
ich hatte vor einiger Zeit einen Thread (</archiv/2003/8/55384/#m308719>)zum Thema URL-Design gestartet. Bei dem Versuch das Ganze jetzt mir hilfe der dortigen Tips und Anregungen in die Tat um zu setzen gibt es Schwierigkeiten.
Das Ziel:
URL vorher: http://www.domain.de/pfad/file
URL nachher: http://www.domain.de/index.php?doc=pfad/file
Der Code: (htaccess)
RewriteEngine on
RewriteCond %{HTTP_HOST} ^http://www.domain.de.*$ [NC]
RewriteCond %{REQUEST_URI} !^/index.php.*$ [NC]
RewriteRule ^/(.*)$ index.php?doc=$1 [L,QSA]
Das Problem:
Er scheint die Umschreibe-Regel nicht anzuwenden und ich weiss nicht so recht wie ich das debuggen kann. Das Problem scheint in der Regel selbst zu liegen, weil es auch nicht funktioniert, wenn ich die eine, die andere, oder beide Bedingungen weglasse. Die Adresse ändert sich auch nicht, wenn ich [R] verwende.
Gruß
Paul
Moin!
URL vorher: http://www.domain.de/pfad/file
URL nachher: http://www.domain.de/index.php?doc=pfad/file
RewriteRule ^/(.*)$ index.php?doc=$1 [L,QSA]
RewriteRule /(.*)/(.*)$ /index.php?doc=$1/$2
Sollte es schon tun...
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Hallo,
RewriteRule /(.*)/(.*)$ /index.php?doc=$1/$2
Das ist recht umständlich, tut aber auch nicht.
Gruß
Paul
Hallo fastix,
RewriteRule /(.*)/(.*)$ /index.php?doc=$1/$2
Wenn /(.*)$ schon nicht funktioniert, funktioniert /(.*)/(.*)$ garantiert auch nicht.
Viele Grüße,
Christian
Hallo Paul,
RewriteEngine on
RewriteBase fehlt. Ist zwar nicht der Grund, aber das gibt nachher Probleme.
RewriteCond %{HTTP_HOST} ^http://www.domain.de.*$ [NC]
Hier liegt der Hund begraben: Der HTTP-Header Host enthält _nur_, aber wirklich _nur_ den Hostnamen, nicht jedoch auch das Protokoll. So sollte es korrekt sein:
RewriteCond %{HTTP_HOST} ^www.domain.de$ [NC]
Viele Grüße,
Christian
Hallo Christian
Hier liegt der Hund begraben: Der HTTP-Header Host enthält _nur_, aber wirklich _nur_ den Hostnamen, nicht jedoch auch das Protokoll. So sollte es korrekt sein:
RewriteCond %{HTTP_HOST} ^www.domain.de$ [NC]
Und das war dann auch das Problem, jetzt gehts.
Danke
Paul
Hallo Paul,
RewriteRule ^/(.*)$ index.php?doc=$1 [L,QSA]
Achja noch etwas: das / am Anfang solltest Du weglassen, sonst greift die RewriteRule nicht. Zumindest nicht, wenn Du RewriteBase setzt, was Du unbedingt tun solltest.
Viele Grüße,
Christian
Hallo,
einen hab' ich noch... jetzt da alle funktioniert ;-)
In erwähntem Thread (</archiv/2003/8/55384/#m308719>) hat glaube ich Sven empfohlen, die Erweiterung ".html" einfach wegzulassen weil's kürzer ist.
Die Adresse sieht dann aus wie eine Pfadangabe ohne Datei. Kann das Probleme geben mit Suchmaschinen mit Pfadlängen-Limits oder Priorität? Und wie reagieren Browser beim abspeichern einer solchen Adresse bei der automatischen Benennung? (Opera7 macht z.B. zwei Punkte vor die Erweiterung)
Ach ja, noch einen: Vor dem Umschreiben war dich Sache mit den Parameter einfach. Der erste Parameter war immer der Dokumentenname mit "?" angehängt, selten aber gelegentlich 0-n weitere Zusatzparameter dann mit "&" hinten dran.
Jetzt fällt der erste Parameter grundsätzlich weg. Die Zusatzparameter werden über verschiedene xsl-Stylesheets verteilt unabhänig von einander hinten dran gehängt. Kein Stylesheet "weiß" also ob eine anderes schon einen Parameter drangehängt hat oder nicht. Ich kann also nicht bestimmen ob der aktuelle Parameter mit "?" oder mit "&" anzuhängen wäre.
Ist es in diesem Fall besser alle Parameter mit "&" oder mit "?" anzuhängen und kann [QSA] das in jedem Fall ausbügeln?
Das [QSA]-Flag scheint beim umschreiben Schwierigkeiten zu haben, wenn die Parameter statt mit "&" mir "&" (DTD-konform) angehängt werden.
Gruß
Paul
Hallo Paul,
Die Adresse sieht dann aus wie eine Pfadangabe ohne Datei. Kann das Probleme geben mit Suchmaschinen mit Pfadlängen-Limits oder Priorität?
Nein. Zumindest nicht mehr als bei normalen Dateien.
Und wie reagieren Browser beim abspeichern einer solchen Adresse bei der automatischen Benennung?
Keine Ahnung, nie probiert. Du kannst es ja mal testen und die Ergebnisse hier veröffentlichen. ;-)
Ach ja, noch einen: Vor dem Umschreiben war dich Sache mit den Parameter einfach. Der erste Parameter war immer der Dokumentenname mit "?" angehängt, selten aber gelegentlich 0-n weitere Zusatzparameter dann mit "&" hinten dran.
Ja, genau.
Die Zusatzparameter werden über verschiedene xsl-Stylesheets verteilt unabhänig von einander hinten dran gehängt. Kein Stylesheet "weiß" also ob eine anderes schon einen Parameter drangehängt hat oder nicht. Ich kann also nicht bestimmen ob der aktuelle Parameter mit "?" oder mit "&" anzuhängen wäre.
Das ist in der Tat doof. Mit XSL kenne ich mich leider nicht aus.
Ist es in diesem Fall besser alle Parameter mit "&" oder mit "?" anzuhängen
Eigentlich weder noch...
und kann [QSA] das in jedem Fall ausbügeln?
Nein, ich glaube nicht. Du kannst es mal versuchen, aber ich bezweifle es.
Das [QSA]-Flag scheint beim umschreiben Schwierigkeiten zu haben, wenn die Parameter statt mit "&" mir "&" (DTD-konform) angehängt werden.
Das dürfte eigentlich nicht passieren... Ich habe bisher mit & keine Probleme gehabt.
Zum XSL-Problem: erkläre doch mal Dein Gesamtkonzept, vielleicht kann man dort etwas ausbessern.
Viele Grüße,
Christian
Hallo Christian,
Zum XSL-Problem: erkläre doch mal Dein Gesamtkonzept, vielleicht kann man dort etwas ausbessern.
Das "Problem" liegt wohl eher darin, daß xslt eine funktionale Sprache ist. Die Programmabfolge ist also explizit nicht festgelegt sondern wird ausschließlich durch die Struktur des Eingangs-Baumes (xml-Dokument) bestimmt - und die ist (zumindest im Rahmen des DTDs) beliebig.
Ich werde also mal ausprobieren, welche der beiden Variante problemloser funktioniert. Davon ausgehend, daß das rewrite-Module die URL grundsätzlich vor der CGI-Schnittstelle in die Finger bekommt, sollte die "&"-Variante sicherer sein.
Schliesslich macht die RewriteRule nichts anderes als vor allen "&"'s immer genau ein "?" einzufügen - und das "?" ist ja das einzige was die CGI-Schnittstelle interessiert. Danach lassen sich etwaige Inkonsistenzen im Query-String einfach in meinem php-Script anfangen.
Gruß
Paul