mod rewrite - bin am verzweifeln
flex1
- webserver
Hallo!
Ich bin schon seit Tagen am probieren, zwischenzeitlich habe ich das Thema schon mal beiseite gelegt.
Aber irgendwie wurmt es mich, ich würde das gern hinbekommen.
Folgendes Problem.
Ich habe aktuell meine Seiten so:
www.XXX.de/nachrichten.php?id=123
Ohne Probleme klappt die Rewrite-Rule
RewriteRule ^(.*)/.*/([0-9]+)$ /$1.php?id=$2
um aus
www.XXX.de/nachrichten/nachrichtentitel_beliebiger_text/123
auf obige URL zu kommen.
Jetzt KANN (muss es aber nicht) es aber noch URLS geben, die so aussehen:
www.XXX.de/nachrichten.php?id=123&idx=3
Da habe ich das hier probiert:
RewriteRule ^(.*)/.*/([0-9]+)(/([0-9]*))$ /$1.php?id=$2&idx=$4
Geht theoretisch, aber alle CSS-Anweisungen werden dann nicht mehr geladen/ genutzt.
UND einfache URLs, also diese:
www.XXX.de/nachrichten/nachrichtentitel_beliebiger_text/123
bringen ein 404-Error.
Ich versteh es einfach nicht :-(
Hat jemand von euch einen Tipp?
Danke!!!
Erkundige dich über das Flag QSA.
mfg Beat
www.XXX.de/nachrichten.php?id=123&idx=3
Da habe ich das hier probiert:
RewriteRule ^(.*)/.*/([0-9]+)(/([0-9]*))$ /$1.php?id=$2&idx=$4
Geht theoretisch
Nein, RewriteRule vergleicht das Muster mit dem URL-Pfad. Der Pfad ist der Teil einer URL zwischen Domain (d.h. beginnend mit dem ersten Schrägstrich) und erstem Fragezeichen (ohne dieses). Die URL-Parametern gehören also _nicht_ dazu, diese kannst du nur mit RewriteCond und der Variablen QUERY_STRING vergleichen und abgreifen (und in die Ziel-URL einsetzen mittels %n).
Für dein Problem, das einfache Weitergeben der Parameter, ist davon unabhängig die Option QSA gedacht, wie von Beat schon erwähnt.
Nein, RewriteRule vergleicht das Muster mit dem URL-Pfad. Der Pfad ist der Teil einer URL zwischen Domain (d.h. beginnend mit dem ersten Schrägstrich) und erstem Fragezeichen (ohne dieses). Die URL-Parametern gehören also
Danke für die Antwort.
Aber meine Urls haben ja keine Paramter in dem Sinne. Also es gibt ja kein Fragezeichen in der Url.
Die reine Url sieht ja so aus
www.XXX.de/nachrichten/nachrichtentitel_beliebiger_text/123
oder eben so
www.XXX.de/nachrichten/nachrichtentitel_beliebiger_text/123/3
Ich versteh auch nicht, warum die CSS-Informationen nicht ausgewertet werden.
Danke!
Hallo,
ich bin gerade irgendwie zu müde, um diese RewriteRules verstehen zu können. Aber ich gebe dir hier mal einen Auszug aus meiner .htaccess - da wird auch sowas erledigt:
RewriteRule ^Bla/Blub/([0-9]{4})/([0-9]{1,2})(/|)$ bla.php?show=Blub&wert1=$1&wert2=$2
Ich verstehe deine Frage so, dass du mal 2 Zahlen hinten dran hast und mal nur eine. Ich würde es mal versuchen, einfach beide Rewrite Rules hinter einander laufen zu lassen. Dann fängt die eine die mit einer Zahl und die andere die mit 2 Zahlen auf.
Die CSS Dateien werden, wenn sie unter das Schema in der RewriteRule fallen natürlich auch umgeleitet. Also mache es entweder mit diesen Ordnerstrukturen, so wie in meinem Beispiel.
(Ich habe keinen Ordner Bla und keinen Blub - also werte ich auch nie auf eine CSS Datei darin verweisen, also wird auch nie eine CSS datei von RewriteRule erfasst.)
Oder du machst noch eine RewriteCond und schließt da .css aus.
Gruß
Alex
Moin!
Die CSS Dateien werden, wenn sie unter das Schema in der RewriteRule fallen natürlich auch umgeleitet. Also mache es entweder mit diesen Ordnerstrukturen, so wie in meinem Beispiel.
(Ich habe keinen Ordner Bla und keinen Blub - also werte ich auch nie auf eine CSS Datei darin verweisen, also wird auch nie eine CSS datei von RewriteRule erfasst.)
Nein, der Ort der CSS-Datei errechnet sich aus der Pfadangabe des CSS-href plus der aktuellen URL (und nicht dem umgeschriebenen Pfad). Sprich: Wenn die CSS-Datei als href="style.css" eingebunden ist, funktioniert das für die URL "/nachrichten.php?irgendwas", aber nicht für die URL "/news/newstitel/23" - weil unter "/news/newstitel/style.css" keine CSS-Datei liegt.
Am einfachsten ist, den Pfad zu solchen Ressourcen immer als absoluten Pfad relativ zum Server anzugeben: href="/style.css". Das Ergebnis davon ist, unabhängig von der aktuellen URL, immer die Datei im Hauptverzeichnis.
- Sven Rautenberg
Am einfachsten ist, den Pfad zu solchen Ressourcen immer als absoluten Pfad relativ zum Server anzugeben: href="/style.css". Das Ergebnis davon ist, unabhängig von der aktuellen URL, immer die Datei im Hauptverzeichnis.
Spitze, hab ich geändert, geht jetzt. Danke!
Aber anscheinend versteh ich die ganze Sache nicht richtig.
Jetzt, wo die Sache zumindest dann geht, wenn zwei Parameter übergeben werden, sehe ich, dass ALLE anderen Links auf der Seite in das Format
www.XXX.de/neuigkeiten/123/neuigkeiten.php?id=1420&idx=1
gewandelt werden.
Dies will ich ja nun auch wieder nicht... Warum wird jetzt immer das "neuigkeiten/123/" vor die Links gesetzt?
Und warum kommt ein 404, wenn nur ein Parameter übergeben wird? Kann man irgendwo sehen, was der Server da für ne Seite eigentlich ausliefern will, die er dann nicht finden kann?
*arrrghhhhhh* :-)
Moin!
Aber anscheinend versteh ich die ganze Sache nicht richtig.
Jetzt, wo die Sache zumindest dann geht, wenn zwei Parameter übergeben werden, sehe ich, dass ALLE anderen Links auf der Seite in das Formatwww.XXX.de/neuigkeiten/123/neuigkeiten.php?id=1420&idx=1
gewandelt werden.
Dies will ich ja nun auch wieder nicht... Warum wird jetzt immer das "neuigkeiten/123/" vor die Links gesetzt?
Rewriting greift nur in einer Richtung. Nämlich beim Umwandeln einer URL in eine Dateiangabe.
Stell dir vor, auf irgendeiner Webseite, z.B. ein Google-Suchergebnis, ist eine URL auf deinem Server zu sehen:
http://www.example.org/neuigkeiten/123
Diese URL ruft jemand im Browser auf. Dadurch kommt die URL in die Adresszeile, und dein Server kriegt einen Request nach "/neuigkeiten/123".
Jetzt kommt das Rewriting und sieht, dass diese URL auf deine RewriteRule passt. Das Ziel ist dann eine URL namens "/neuigkeiten.php?id=123"
Und dann kommt der Standard-Mechanismus von Apache, der dieses PHP-Skript startet, den Parameter übergibt, und das Ergebnis des Skripts dann an den Browser liefert. Fertig.
Der Punkt ist: Wenn dein Skript seinerseits einen Link auf eine andere Neuigkeit enthält, muss es diesen Link natürlich auch in der passenden URL-Form ausgeben! Da hilft dir aber das Rewriting nicht, dafür bist du selbst verantwortlich.
Nehmen wir mal an, deine Neuigkeiten-Seite 123 listet die aktuellsten 5 News mit den IDs 210 bis 214. Dann muss der Link, den du ins HTML schreibst, so lauten: <a href="/neuigkeiten/210">Titel</a>
Momentan schreibst du aber höchstwahrscheinlich: <a href="?id=210">Titel</a>, vielleicht auch <a href="neuigkeiten.php?id=210">Titel</a>
Das scheitert, bzw. liefert nicht das von dir gewünschte Ergebnis, denn der Browser ist ja weiterhin auf der URL "/neuigkeiten/123", und relativ zu dieser URL kommt jetzt dein Link ins Spiel:
"/neuigkeiten/123" plus "?id=210" ergibt "/neuigkeiten/123?id=210"
"/neuigkeiten/123" plus "neuigkeiten.php?id=210" ergibt "/neuigkeiten/neuigkeiten.php?id=210"
Das ist eine Sache, die sich halt komplett im Browser abspielt, weil der ausschließlich relative URLs zusammenaddiert.
Welchen Effekt es aufgrund deiner Rewrite-Rule nun hat, wenn man diese URL aufruft, wäre zu untersuchen. Wenn du für den zweiten Pfadteil explizit nach Ziffern suchst, wie in deinem Ausgangsposting angedeutet, dann wird diese RewriteRule bei dem zweiten Beispiel, das ich gegeben habe, nicht mehr zutreffen, weil der zweite Pfadteil ja "neuigkeiten.php" lautet und keinerlei Ziffern enthält. Folglich wird die RewriteRule nicht mehr ausgeführt. Und deshalb gibts 404, wenn keine weitere Rule dahinter doch noch zutrifft.
Und warum kommt ein 404, wenn nur ein Parameter übergeben wird? Kann man irgendwo sehen, was der Server da für ne Seite eigentlich ausliefern will, die er dann nicht finden kann?
Du kannst das RewriteLog anschalten versuchen, und dadurch sehen, was mod_rewrite so macht. Bringt aber eher nix, wenn du vorher nicht deine Linkausgabe so geändert hast, dass die von dir präferierten URLs auch tatsächlich an den Browser ausgegeben werden.
- Sven Rautenberg