Apache mod_rewrite: RewriteRules greifen nicht?
knubbel
- webserver
Hallo Forum!
Ich experimentiere heute Abend etwas mit mod_rewrite herum. Das Ziel: Verzeichnisaufrufe im Format sprache/seite/ auf index.php?l=sprache&p=seite zu lenken (jedoch nicht als Redirect).
Was sich jedoch als Ursache meines Problems herausstellen könnte ist der Umstand, dass das dazugehörige Projekt und damit auch die .htaccess nicht im Wurzelverzeichnis liegen - das schon einmal vorweg. Sagen wir mal, das Wurzelverzeichnis meines Projekts befindet sich unter:
http://127.0.0.1/abc/test/
Nach mehreren Fehlversuchen (404s) habe ich nun meine RewriteRule derart simplifiziert, dass wenigstens auf meine index.php weitergeleitet wird:
RewriteRule . index.php
Wie bei den Versuchen zuvor jedoch gelangte ich wieder auf eine 404 Fehlerseite, was auch immer ich an http://127.0.0.1/abc/test/ anhängte.
Ich scheine etwas Grundlegendes falsch zu machen. Weiß jemand, was?
Danke!
Daniel
Hi,
Ich scheine etwas Grundlegendes falsch zu machen. Weiß jemand, was?
Was deine Problembeschreibung angeht: Du lieferst keinerlei brauchbare Information.
Bitte Tipps für Fragende *noch* *mal* lesen - und dann etwas mehr Substanz liefern.
MfG ChrisB
Hi,
Ich scheine etwas Grundlegendes falsch zu machen. Weiß jemand, was?
Was deine Problembeschreibung angeht: Du lieferst keinerlei brauchbare Information.
Also gut, dann muss ich es noch einmal versuchen. Mir fällt kein guter Weg ein, das Problem anständig kurz zu fassen und keine allein schon durch ihre Länge abschreckenden Texte zu verfassen...
Noch einmal von vorn. Das Ziel meiner Unternehmung ist es, Seitenaufrufe, die in gut lesbarer Form als Verzeichnisse getarnt sind, auf eine einzelne index.php-Datei im Wurzelverzeichnis des Projekts umzuleiten, oder anders gesagt: Verzeichnisse vorzugaukeln, deren Namen als Parameter für ein PHP-Script dienen sollen.
Ein möglicher Aufruf wäre dieser:
http://127.0.0.1/pfad/zum/projekt/wert1/wert2/
Effektiv soll jedoch diese Adresse, vom Nutzer jedoch unbemerkt, aufgerufen werden:
http://127.0.0.1/pfad/zum/projekt/index.php?param1=wert1¶m2=wert2
Das natürlich mit der Möglichkeit, andere Werte zu verwenden, ohne sie alle einzeln als Regeln aufzuführen.
Das ist das Ausgangsproblem, das ich mithilfe von mod_rewrite und anhand der Dokumentation auf SELFHTML sowie einiger Beispiele auf der Apache-Website und dunkler Erinnerung an vergangene Experimente zu lösen versucht habe - ohne Erfolg.
Mittlerweile habe ich das Ausgangsproblem zu Testzwecken derart vereinfacht, dass ich einen "festen" (nicht variablen) Aufruf der Adresse
http://127.0.0.1/pfad/zum/projekt/beispiel
auf die Adresse
http://127.0.0.1/pfad/zum/projekt/index.php
weiterzuleiten versuche. Der Inhalt der .htaccess-Datei, die dafür Sorge tragen soll, sieht folgendermaßen aus:
RewriteEngine on
RewriteRule ^beispiel$ index.php
Auch das funktioniert nicht. Eine hinzugefügte Basis
RewriteBase /pfad/zum/projekt/
ändert nichts an diesem Umstand.
Da ich in bisherigen Projekten, deren .htaccess-Dateien allesamt immer im Wurzelverzeichnis der Webadresse (z.B. http://example.com/, jedoch nicht im Wurzelverzeichnis des Webservers) lagen, keine Probleme hatte, vermute ich, dass mein aktuelles Problem durch die Lage des Projekts in einem Unterordner zusammenhängt; die dazugehörige .htaccess-Datei ins Wurzelverzeichnis der Adresse zu verschieben kommt leider nicht infrage.
Ich hoffe sowohl, dass ich mich diesmal verständlicher ausgedrückt habe, als auch, dass jemand sich durch diesen Text durcharbeitet. An alle, die es tun: Danke!
Daniel
Hi,
Mittlerweile habe ich das Ausgangsproblem zu Testzwecken derart vereinfacht, dass ich einen "festen" (nicht variablen) Aufruf der Adresse
http://127.0.0.1/pfad/zum/projekt/beispielauf die Adresse
http://127.0.0.1/pfad/zum/projekt/index.phpweiterzuleiten versuche. Der Inhalt der .htaccess-Datei, die dafür Sorge tragen soll, sieht folgendermaßen aus:
RewriteEngine on
RewriteRule ^beispiel$ index.php
Und wo innerhalb dieses Pfades liegt die .htaccess jetzt?
Auch das funktioniert nicht. Eine hinzugefügte Basis
RewriteBase /pfad/zum/projekt/
ändert nichts an diesem Umstand.
RewriteBase braucht man normalerweise nur dann, wenn der Präfix des Pfades bis zu der Stelle, ab der man umschreiben will, nicht der physisch Verzeichnisstruktur entspricht.
MfG ChrisB
Und wo innerhalb dieses Pfades liegt die .htaccess jetzt?
Im Wurzelverzeichnis des Projekts, also unter
http://127.0.0.1/pfad/zum/project/
Wie im letzten Absatz meines längeren Postings angemerkt kommt das Verschieben nach
http://127.0.0.1/
nicht infrage.
Danke, Daniel
Hi,
Und wo innerhalb dieses Pfades liegt die .htaccess jetzt?
Im Wurzelverzeichnis des Projekts, also unter
http://127.0.0.1/pfad/zum/project/
Dann hätte die gezeigte Regel
RewriteRule ^beispiel$ index.php
aber eigentlich funktionieren sollen.
Es ist dein eigener Server?
Dann schalte mal das RewriteLog ein, und schau was das zur Abarbeitung der Regel sagt.
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog
MfG ChrisB
Dem Umstand, dass nichts geloggt wird, entnehme ich, dass das Modul offenbar nicht geladen wird. Das erklärt immerhin, warum nichts funktioniert.
Ich werde nun also erst einmal das Internet durchforsten, um herauszufinden, wie ich das Modul aktiviere (obwohl es das eigentlich sein sollte, es handelt sich um eine aus den Ubuntu-Paketquellen installierte Version).
Wenn dann immer noch nichts klappt, melde ich mich noch einmal.
Danke und bis dahin
Daniel
Hi!
Dem Umstand, dass nichts geloggt wird, entnehme ich, dass das Modul offenbar nicht geladen wird. Das erklärt immerhin, warum nichts funktioniert.
Welches Modul, welches Logging? Es gibt davon ja nicht nur jeweils eins. Wenn ein Modul nicht vorhanden ist, gibt es üblicherweise einen 500er Fehler, wenn ihm jemand Direktiven dieses Moduls unterzuschieben versucht. Wenn deine Versuche 404er ergeben, stimmen nur die Regeln nicht mit deinen Gegebenheiten überein. Es ist hilfreich, RewriteLog und RewriteLogLevel zu konfigurieren (Reload nicht vergessen) und sich anzuschauen, was geneu wie umgeschrieben wird. Das sieht nur auf den ersten Blick recht umfangreich und undurchsichtig aus.
Lo!
Es ist hilfreich, RewriteLog und RewriteLogLevel zu konfigurieren (Reload nicht vergessen) und sich anzuschauen, was geneu wie umgeschrieben wird. Das sieht nur auf den ersten Blick recht umfangreich und undurchsichtig aus.
Wenn es nur so wäre! Stimmt, ein 500er hätte mehr Sinn gemacht und gemeint war das mod_rewrite und das dazugehörige RewriteLogging, das auch du gerade angesprochen hast und ChrisB verlinkt hat.
Das RewriteLogLevel habe ich, als sich beim ersten Loggingversuch nichts getan hat, ebenfalls konfiguriert und auf 3 gesetzt, auch hier hat sich aber nichts getan, es wurde nichts geloggt.
Mit umfangreich und undurchsichtig kann ich in der Regel ja etwas anfangen, aber wenn überhaupt nichts geloggt wird...
Danke, Daniel
Hi,
Das RewriteLogLevel habe ich, als sich beim ersten Loggingversuch nichts getan hat, ebenfalls konfiguriert und auf 3 gesetzt, auch hier hat sich aber nichts getan, es wurde nichts geloggt.
Hast du es an der richtigen Stelle konfiguriert, und auch den Server neu gestartet?
MfG ChrisB
Hast du es an der richtigen Stelle konfiguriert, und auch den Server neu gestartet?
Wie ich gerade sehe, war es die falsche Stelle. Da ist das "nicht" schon fett gedruckt...
Nun habe ich es in der apache2.conf unter /etc/apache2/ vermerkt. Beim Neustart allerdings erhalte ich diese Meldung:
Syntax error on line 229 of /etc/apache2/apache2.conf:
Invalid command 'RewriteLog', perhaps misspelled or defined by a module not included in the server configuration
Die Zeilen sehen so aus:
RewriteLog "/home/<usw.>/Desktop/rewrite.log"
RewriteLogLevel 3
Es wirkt also so, als ob das Modul eben doch nicht aktiviert wäre. Seltsam ist dann aber zugegebenermaßen, dass es keinen 500er-Fehler gibt sondern nur den 404er.
Daniel
Hi!
Invalid command 'RewriteLog', perhaps misspelled or defined by a module not included in the server configuration
Na, dann schau doch mal bei den Moduleinbindungen nach, was da zu mod_rewrite zu finden ist.
Es wirkt also so, als ob das Modul eben doch nicht aktiviert wäre. Seltsam ist dann aber zugegebenermaßen, dass es keinen 500er-Fehler gibt sondern nur den 404er.
Hat vielleicht noch andere Ursachen. Geht eine Per-Verzeichnis-Konfiguration (meist .htaccess genannt) überhaupt?
Lo!
Das Problem ist mittlerweile gelöst - in einem weiteren Zweig etwas früher im Thema hat sich DiBo33 eingeschaltet und mir einen Tipp gegeben, wie ich mod_rewrite aktiviere, wenn es denn ausgeschaltet ist. Das habe ich getan, nun läuft alles, wie es soll.
Naja, fast. Momentan scheitere ich an einer sinnvollen Lösung, auf Bilder im Wurzelverzeichnis des Projekts mit relativen Pfaden zuzugreifen (sie können nun immerhin von Seiten aufgerufen werden, die der Browser für bis zu zwei Verzeichnisebenen tiefer verschachtelt hält), aber da werde ich wohl auf absolute Pfade umsteigen.
Das wichtigste funktioniert also, der Rest ist Fine-Tuning und wird schon noch.
Danke noch einmal an alle, die geholfen haben!
Daniel
Hast du mod_rewrite unter Ubuntu überhaupt schon aktiviert?
http://matthias.yellowled.de/archives/805-mod_rewrite-fuer-Apache2-unter-Ubuntu-aktivieren.html
Hast du mod_rewrite unter Ubuntu überhaupt schon aktiviert?
http://matthias.yellowled.de/archives/805-mod_rewrite-fuer-Apache2-unter-Ubuntu-aktivieren.html
Danke, dieser Tipp war Gold wert!
Tatsächlich war es noch nicht aktiviert. Kurios, dass ich beim Googlen nach exakt diesem Problem nichts gefunden habe.
mod_rewrite funktioniert also endlich (und auch meine Minimalversion der RewriteRule). Werde mich also wieder an mein Ausgangsproblem begeben.
Vielen Dank!
Daniel
Oh, etwas wichtiges habe ich noch vergessen.
"Funktioniert nicht" bedeutet in diesem Fall, dass ich statt der erwarteten Seite die 404-Fehlerseite des Webservers präsentiert bekomme.
Daniel