mod_rewrite problem mit slashes
Jeena Paradies
- webserver
Hallo,
Ich habe wieder mal ein Problem mir mod_rewrite welches ich jetzt nun nach dem halben Abend und der halben Nacht nicht allein lösen konnte.
Ich habe einen Ordner /artikel/ dort in der .htaccess befindet sich folgender Code:
RewriteEngine on
RewriteCond %{REQUEST_URI} !/index.php
RewriteRule "^(.+)" "../scripte/artikel.php?artikel=$1"
wenn ich also /archiv/text als URL habe dann bekomme ich text als GET Variable für mein Script und alles geht wunderbar.
wenn ich nun aber /archiv/text/ als URL habe dann bekomme ich text/ als GET Variable für mein Script was ich im Script zwar löschen könnte aber dann befindet sich das Script dann in einem anderen Ordner so dass die Pfadangaben von css und den Bildern nicht mehr passen.
Wie kann ich die zwei Fliegen mit einer Klappe schlagen und das mit RewriteRules machen?
http://httpd.apache.org/docs/misc/rewriteguide.html kann mir auch nicht helfen da es genau das umgekehrte im Beispiel macht.
Grüße
Jeena Paradies
Hi,
RewriteRule "^(.+)" "../scripte/artikel.php?artikel=$1"
RewriteRule "^(.+)/?$" "../scripte/artikel.php?artikel=$1"
Damit wird ein (optionaler) / am Ende nicht mehr in $1 abgelegt.
(ungetestet, ggf. ist der \ vor dem / überflüssig)
cu,
Andreas
use Mosche;
RewriteEngine on
RewriteCond %{REQUEST_URI} !/index.php
RewriteRule "^(.+)" "../scripte/artikel.php?artikel=$1"wenn ich also /archiv/text als URL habe dann bekomme ich text als GET Variable für mein Script und alles geht wunderbar.
wenn ich nun aber /archiv/text/ als URL habe dann bekomme ich text/ als GET Variable für mein Script was ich im Script zwar löschen könnte aber dann befindet sich das Script dann in einem anderen Ordner so dass die Pfadangaben von css und den Bildern nicht mehr passen.
Sobald du mit mod_rewrite anfängst, sollten alle Pfade zu Ressourcen wie deinem CSS sowieso absolut sein, erspart dir viel Arbeit.
Außerdem kannst du noch die RewriteRule anpassen:
RewriteRule "^(.+)/?$" ...
Ein eventueller Slash am Ende ist jetzt _nicht_ mehr Bestandteil von $1.
Auch der Ersetzungspfad sollt absolut sein, also mach das ".." weg. Dann klappt es auch mit den Pfaden.
use Tschoe qw(Matti);
hi,
wenn ich nun aber /archiv/text/ als URL habe dann bekomme ich text/ als GET Variable für mein Script was ich im Script zwar löschen könnte aber dann befindet sich das Script dann in einem anderen Ordner so dass die Pfadangaben von css und den Bildern nicht mehr passen.
entweder, du machst für den fall mit slash am ende eine extra-regel, die dem client einen redirect auf die ressource ohne slash am ende sendet - oder du referenzierst dein CSS-file und deine bilder absolut, bzw. relativ vom web root aus gesehen.
gruss,
wahsaga
Hallo,
entweder, du machst für den fall mit slash am ende eine extra-regel, die dem client einen redirect auf die ressource ohne slash am ende sendet - oder du referenzierst dein CSS-file und deine bilder absolut, bzw. relativ vom web root aus gesehen.
Der erste Fall wäre mir viel lieber. Mittlerweile bin ich so weit:
RewriteEngine on
RewriteCond %{REQUEST_URI} !/index.php
RewriteCond %{REQUEST_URI} !/artikel.php
RewriteRule "^(.+)" "artikel.php?artikel=$1"
Jetzt ist das artikel.php Script im Verzeichniss /archiv/ so war das auch am anfang gedacht nur hat es nicht funktioniert so lange die zweite Cond nicht da war. Doch ich komme nicht drauf wie eine extra-Regel aussehen müsste die mir das Slash umschreibt in das gleiche ohne Slash. Könntet ihr mir da ein wenig helfen?
Da Problem bei absoluten Pfaden ist dass ich das hier erst alles auf meinem Rechner mit einer völlig anderen Ordnerstruktur machen will/muss bevor ich es auf den Server im Internet hochladen kann wo wieder alles anders aussieht. Es wäre sehr schön wenn es überall gleich funktionieren würde ohne dass ich die Scripte und Seiten wieder ändern muss.
Grüße
Jeena Paradies
hi,
Da Problem bei absoluten Pfaden ist dass ich das hier erst alles auf meinem Rechner mit einer völlig anderen Ordnerstruktur machen will/muss bevor ich es auf den Server im Internet hochladen kann wo wieder alles anders aussieht. Es wäre sehr schön wenn es überall gleich funktionieren würde ohne dass ich die Scripte und Seiten wieder ändern muss.
deshalb ja auch mein vorschalg, relativ zum web root zu verlinken.
die ordner-struktur wird ja auf test- und produktivsystem gleich sein, nehme ich an? nur vielleicht auf dem testsystem ein paar ordner tiefer ...
dann würde ich einen virtual host einrichten, der unterhalb seines web root die gleiche ordnerstruktur liegen hat, wie der produktive host.
dann kannst du bequem alles über /... referenzieren.
gruss,
wahsaga
Hallo,
deshalb ja auch mein vorschalg, relativ zum web root zu verlinken.
die ordner-struktur wird ja auf test- und produktivsystem gleich sein, nehme ich an? nur vielleicht auf dem testsystem ein paar ordner tiefer ...
Ja genau. Aber anscheinend habe ich es immer noch nicht so richtig kapiert wie ich das machen soll.
dann würde ich einen virtual host einrichten, der unterhalb seines web root die gleiche ordnerstruktur liegen hat, wie der produktive host.
dann kannst du bequem alles über /... referenzieren.
Ich glaube mein Problem liegt darin dass ich nicht weiß wa /... ist. Suchmaschinen spucken zu "/..." auch nichts aus Nach was muss ich suchen? Ist dass dann das gleiche wie / ?
Na dann mach ich mich mal auf die Suche nach einem howto wie man einen virtual host einrichtet.
Grüße
Jeena Paradies
Hallo,
Na dann mach ich mich mal auf die Suche nach einem howto wie man einen virtual host einrichtet.
NameVirtualHost *
<VirtualHost *>
DocumentRoot /home/jeena/Webs/jeenas-home5/
</VirtualHost>
Also zum ausprobieren reicht mit das jetzt ist http://localhost/ = /home/jeena/Webs/jeenas-home5/
Doch da ist schon das nächste Problem die RewriteRule funktioniert nun überhaupt nicht mehr. Dabei ist es die gleiche wie vorher.
Bei http://localhost/artikel/test bekomme ich nur eine 404 anstatt des artikel.php?artikel=test
Zur Erinnerung:
RewriteEngine on
RewriteCond %{REQUEST_URI} !/index.php
RewriteCond %{REQUEST_URI} !/artikel.php
RewriteRule "^(.+)" "artikel.php?artikel=$1"
Im Endeffekt mache ich was dann funktioniert leider das alte nicht mehr sch**. Na irgendwann kriege ich es schon hin, andere habens ja auch hinbekommen.
Grüße
Jeena Paradies
use Mosche;
Bei http://localhost/artikel/test bekomme ich nur eine 404 anstatt des artikel.php?artikel=test
Zur Erinnerung:
RewriteEngine on
RewriteCond %{REQUEST_URI} !/index.php
RewriteCond %{REQUEST_URI} !/artikel.php
RewriteRule "^(.+)" "artikel.php?artikel=$1"
Jetzt mal ausführlich.
Du hast einen Ordner /artikel und darin liegt eine .htaccess mit oben genanntem Inhalt.
Ich erkläre dir mal, was bei einzelnen Zugriffen passiert:
a) Zugriff auf /artikel/test
Das wird umgeleitet auf /artikel/artikel.php?artikel=test . /artikel/artikel.php deshalb, weil du artikel.php relativ referenziert hast. Wenn du auf /artikel.php?artikel=$1 umleitest, landest du auf /artikel.php?artikel=test
b) Zugriff auf /artikel/test/
Das wird umgeleitet auf /artikel/test/artikel.php?artikel=test/ aus gleichem Grund (lokaler Referenzierung).
Wo liegt deine artikel.php? In artikel (also /artikel/artikel.php)?
Dann leite um auf /artikel/artikel.php?artikel=$1
Die Gänsefüßchen um das Umleitungsziel kannst du weglassen.
Merke: wenn du irgendwie umleitest, referenzier möglichst alles absolut.
RewriteRule "^(.+)$" /artikel/artikel.php?artikel=$1
use Tschoe qw(Matti);
Hallo,
Du hast einen Ordner /artikel und darin liegt eine .htaccess mit oben genanntem Inhalt.
genau.
Ich erkläre dir mal, was bei einzelnen Zugriffen passiert:
a) Zugriff auf /artikel/test
Das wird umgeleitet auf /artikel/artikel.php?artikel=test . /artikel/artikel.php deshalb, weil du artikel.php relativ referenziert hast. Wenn du auf /artikel.php?artikel=$1 umleitest, landest du auf /artikel.php?artikel=test
Seit dem es auf dem virtual host läuft leider nicht mehr, und ich weiß nicht warum, es wird anscheinend nichts mehr umgeschrieben.
b) Zugriff auf /artikel/test/
Das wird umgeleitet auf /artikel/test/artikel.php?artikel=test/ aus gleichem Grund (lokaler Referenzierung).
Warum wird dann das CSS und die Bilder nicht mehr angezeigt? Wenn ich das richtig verstehe passiert genau das gleiche wie vorher nur dass in der Variable ein zusätzliches / dabei ist, oder? (aber das auch alles wenn ich nicht mit vhost arbeite)
Wo liegt deine artikel.php? In artikel (also /artikel/artikel.php)?
Ja.
Dann leite um auf /artikel/artikel.php?artikel=$1
Die Gänsefüßchen um das Umleitungsziel kannst du weglassen.
Merke: wenn du irgendwie umleitest, referenzier möglichst alles absolut.
RewriteRule "^(.+)$" /artikel/artikel.php?artikel=$1
Ok das werde ich versuchen. Auf dem richtigen Server wird das wohl nicht das Problem sein, aber hier bei mir will mein vhost nicht funktionieren, und gibt mir nur eine 404. Ich muss es aber erst einmal ausprobieren bevor ich es hochlade.
Wenn ich es ganz normal mache dann habe ich den Pfad http://localhost/open/Webs/jeenas-home5/artikel/artikel.php dann müsste ich das dann überall ändern wenn ich es hochlade.
Irgendwie funktioniert das ganze auf jeden fall, und ich bleibe dran. Ich habe jetzt bei dem vhost versucht RewriteRule "^(.+)$" /artikel/artikel.php?artikel=$1 zu benutzen aber da auch nur ein 404. Es liegt aber anscheinend am vhost dass der nicht so richtig arbeitet wie ich will. Ich dachte aber dass der alles was ich nicht explizit an Einstellungen geändert habe er vom normalen Server nimmt. Und geändert habe ich nur
DocumentRoot /home/jeena/Webs/jeenas-home5/
--------
So jetzt habe ich den vhost weggelassen und dafür für den normalen localhost auf DocumentRoot /home/jeena/Webs/jeenas-home5/ geändert. Da funktioniert das auch nicht. Genau das gleiche Phänomen.
Die RewriteRoule wird gar nicht angewendet warum denn nicht???
Grüße
Jeena Paradies
use Mosche;
Die RewriteRoule wird gar nicht angewendet warum denn nicht???
Wie wärs, du gibst uns einfach mal nen Auszug aus error.log? Außerdem wäre ein RewriteLogLevel (und passende Direktiven) und der daraus folgende Auszug aus dieser Logdatei nicht schlecht.
use Tschoe qw(Matti);
Hallo,
Wie wärs, du gibst uns einfach mal nen Auszug aus error.log? Außerdem wäre ein RewriteLogLevel (und passende Direktiven) und der daraus folgende Auszug aus dieser Logdatei nicht schlecht.
error.log
[...] File does not exist: /home/jeena/Webs/jeenas-home5/artikel/Kinderschlagen
[...] File does not exist: /home/jeena/Webs/jeenas-home5/artikel/Kinderschlagen/
Aber RewriteLogLevel wo muss das hin oder woher bekomme ich das? Was ist das? Muss ich erst einmal gucken...
Grüße
Jeena Paradies
Hallo,
Wie wärs, du gibst uns einfach mal nen Auszug aus error.log? Außerdem wäre ein RewriteLogLevel (und passende Direktiven) und der daraus folgende Auszug aus dieser Logdatei nicht schlecht.
So sieht es jetzt aus:
RewriteEngine on
RewriteLog /var/log/apache/rewrite.log
RewriteLogLevel 9
RewriteCond %{REQUEST_URI} !/index.php
RewriteCond %{REQUEST_URI} !/artikel.php
RewriteRule "^(.+)$" ./artikel.php?artikel=$1
Aber leider bekomme ich keine rewrite.log es passiert einfach nichts außer der 404
Grüße
Jeena Paradies
Hallo,
Nach tagelangem Suchmaschinenfütterns und ewig viel Text Lesens bin ich auf eine Seite gekommen die ziemlich vielversprechend aussah: http://www.yourhtmlsource.com/sitemanagement/urlrewriting.html
Dort wird beschrieben wie man an jede URL einen slash anhängt, was für mich sehr vorteilhaft wäre, da ich dann einheitlich überall einen slash hätte. Damit könnte ich arbeiten als wäre ich in einem tieferen Verzeichniss, und könnte trotzdem meine schönen ../blabla.png beibehalten und so auf dem Testsystem und dem Produktivsystem die gleichen Scripte fahren, ohne einen Virtual Host zu machen (was ich übrigens nicht so schaffe dass er mir auch rewriterules ausführt).
Es funktioniert auch alles wunderbar nur leider noch nicht ganz.
mein DocumentRoot in der httpd.conf ist /var/www und wenn ich
http://localhost/open/Webs/jeenas-home5/artikel/test
eingebe werde ich leider zu
http://localhost/var/www/open/Webs/jeenas-home5/artikel/test/
weitergeleitet was es natürlich nicht gibt. Warum das so ist weiß ich natürlich wieder nicht und auf der Seite wird so etwas auch nicht beschrieben.
So sieht die http://localhost/open/Webs/jeenas-home5/artikel/.htaccess aus:
---------------------
RewriteEngine on
RewriteRule ^([a-zA-Z0-9-_]+)$ $1/ [R]
RewriteCond %{REQUEST_URI} !/index.php
RewriteCond %{REQUEST_URI} !/artikel.php
RewriteRule "^([a-zA-Z0-9-_]+)/" ./artikel.php?artikel=$1
---------------------
Kann mir vielleicht jemand dabei helfen herauszufinden wie ich das so ändern kann dass ich zu http://localhost/open/Webs/jeenas-home5/artikel/test/ umgeleitet werde?
Grüße
Jeena Paradies