Probleme mit RewriteRule
Fabian St.
- webserver
0 Fabian St.0 wahsaga0 Fabian St.0 wahsaga0 Fabian St.0 wahsaga
Hi!
Ich mache gerade meine ersten Gehversuche mit mod_rewrite und bin dabei auf einige Probleme gestoßen:
Mittels folgender RewriteRule sollen Anfragen von http://erde/~fabi/info/einleitung.html auf http://erde/~fabi/info/index.php5?site=einleitung umgeleitet werden:
Options +FollowSymLinks
RewriteEngine On
RewriteBase /~fabi/info
RewriteRule ^([a-z0-9]+)\.html$ /index.php5?site=$1
Dies funktioniert auch. Doch wenn ich nun das '.html' in der RewriteRule weglasse [1] bekomme ich einen 404er - Not Found. Woran könnte dies liegen? In der rewrite_log steht in diesem Fall nämlich überhaupt nichts...
Grüße,
Fabian St.
[1] Damit Anfragen an http://erde/~fabi/info/einleitung auf http://erde/~fabi/info/index.php5?site=einleitung umgeleitet werden.
Hi!
Kleiner Nachtrag: Das Problem tritt auch im DOCUMENT_ROOT auf, d.h. auch ohne Verwendung von mod_userdir und der damit verbundenen Angabe der RewriteBase.
Auf weitere Hilfen würde ich mich freuen...
Grüße,
Fabian St.
hi,
RewriteBase /~fabi/info
RewriteRule ^([a-z0-9]+).html$ /index.php5?site=$1Dies funktioniert auch. Doch wenn ich nun das '.html' in der RewriteRule weglasse
was bleibt dann als bedingung bei dir übrig?
^([a-z0-9]+)$
oder
^([a-z0-9]+) (ohne $ am ende)
?
bekomme ich einen 404er - Not Found. Woran könnte dies liegen?
meine theorie wäre:
wenn du die endung .html nicht in die bedingung einbeziehst - dann trifft die RewriteRule auch auf den _folgenden_ (internen) request zu - der geht nämlich auf index.php (plus query string, der beim rewriten aber unberücksichtigt bleibt).
(gut, der punkt passt da nicht wirklich rein in [a-z0-9]
aber zweite oben genannte variante ohne $ am ende könnte auch das erklären.)
also wird der (interne) request seinerseits wieder von der regel abgegriffen, und auf /index.php5?site=index.php weitergeleitet, etc. pp.
du hättest dich also in einem netten kleinen loop gefangen (unter der annahme, dass meine vermutung zutrifft).
versuche also mal, die Rule um das flag [L] oder auch [NS] zu ergänzen.
gruß,
wahsaga
Hi wahsaga!
was bleibt dann als bedingung bei dir übrig?
^([a-z0-9]+)$
oder
^([a-z0-9]+) (ohne $ am ende)
?
In der Logs steht immer 'applying pattern ^([a-z0-9]+).html$ ...', sodass ich jetzt mal davon ausgehe, dass das $ stehenbleibt.
Nach dem Hochsetzten des LogLevels erhalte ich nun folgende Ausgaben (für die Anfrage http://localhost/~fabi/info/links.html ---> http://localhost/~fabi/info/index.php5?site=links):
127.0.0.1 - - [23/Mar/2005:00:08:35 +0100] [localhost/sid#80a0e48][rid#82b8700/initial] (3) [per-dir /home/fabi/public_html/info/] strip per-dir prefix: /home/fabi/public_html/info/links.html -> links.html
127.0.0.1 - - [23/Mar/2005:00:08:35 +0100] [localhost/sid#80a0e48][rid#82b8700/initial] (3) [per-dir /home/fabi/public_html/info/] applying pattern '^([a-z0-9]+).html$' to uri 'links.html'
127.0.0.1 - - [23/Mar/2005:00:08:35 +0100] [localhost/sid#80a0e48][rid#82b8700/initial] (2) [per-dir /home/fabi/public_html/info/] rewrite links.html -> index.php5?site=links
127.0.0.1 - - [23/Mar/2005:00:08:35 +0100] [localhost/sid#80a0e48][rid#82b8700/initial] (3) split uri=index.php5?site=links -> uri=index.php5, args=site=links
127.0.0.1 - - [23/Mar/2005:00:08:35 +0100] [localhost/sid#80a0e48][rid#82b8700/initial] (3) [per-dir /home/fabi/public_html/info/] add per-dir prefix: index.php5 -> /home/fabi/public_html/info/index.php5
127.0.0.1 - - [23/Mar/2005:00:08:35 +0100] [localhost/sid#80a0e48][rid#82b8700/initial] (2) [per-dir /home/fabi/public_html/info/] trying to replace prefix /home/fabi/public_html/info/ with /~fabi/info
127.0.0.1 - - [23/Mar/2005:00:08:35 +0100] [localhost/sid#80a0e48][rid#82b8700/initial] (5) strip matching prefix: /home/fabi/public_html/info/index.php5 -> index.php5
127.0.0.1 - - [23/Mar/2005:00:08:35 +0100] [localhost/sid#80a0e48][rid#82b8700/initial] (4) add subst prefix: index.php5 -> /~fabi/info/index.php5
127.0.0.1 - - [23/Mar/2005:00:08:35 +0100] [localhost/sid#80a0e48][rid#82b8700/initial] (1) [per-dir /home/fabi/public_html/info/] internal redirect with /~fabi/info/index.php5 [INTERNAL REDIRECT]
127.0.0.1 - - [23/Mar/2005:00:08:35 +0100] [localhost/sid#80a0e48][rid#82c7978/initial/redir#1] (3) [per-dir /home/fabi/public_html/info/] strip per-dir prefix: /home/fabi/public_html/info/index.php5 -> index.php5
127.0.0.1 - - [23/Mar/2005:00:08:35 +0100] [localhost/sid#80a0e48][rid#82c7978/initial/redir#1] (3) [per-dir /home/fabi/public_html/info/] applying pattern '^([a-z0-9]+).html$' to uri 'index.php5'
127.0.0.1 - - [23/Mar/2005:00:08:35 +0100] [localhost/sid#80a0e48][rid#82c7978/initial/redir#1] (1) [per-dir /home/fabi/public_html/info/] pass through /home/fabi/public_html/info/index.php5
Die .htaccess ist dabei folgende:
Options +FollowSymLinks
RewriteEngine On
RewriteBase /~fabi/info
RewriteRule ^([a-z0-9]+).html$ index.php5?site=$1 [L] [NS]
Wenn ich nun jedoch folgende .htaccess verwende, bleibt die rewrite_log leer und eine Anfrage von http://localhost/~fabi/info/links wird nicht an http://localhost/~fabi/info/index.php5?site=links weitergeleitet, sondern ich bekomme - wie gesagt - einen 404er: The requested URL /~fabi/info/links was not found on this server.
Options +FollowSymLinks
RewriteEngine On
RewriteBase /~fabi/info
RewriteRule ^([a-z0-9]+)$ index.php5?site=$1 [L] [NS]
meine theorie wäre:
wenn du die endung .html nicht in die bedingung einbeziehst - dann trifft die RewriteRule auch auf den _folgenden_ (internen) request zu - der geht nämlich auf index.php (plus query string, der beim rewriten aber unberücksichtigt bleibt).
(gut, der punkt passt da nicht wirklich rein in [a-z0-9]
aber zweite oben genannte variante ohne $ am ende könnte auch das erklären.)also wird der (interne) request seinerseits wieder von der regel abgegriffen, und auf /index.php5?site=index.php weitergeleitet, etc. pp.
du hättest dich also in einem netten kleinen loop gefangen (unter der annahme, dass meine vermutung zutrifft).
Oh, ich glaube damit muss ich mich noch gründlicher auseinandersetzten... ;-)
versuche also mal, die Rule um das flag [L] oder auch [NS] zu ergänzen.
Wie du in obigen Beispielen sehen kannst, haben die beiden Flags _L_astRule und _N_o internal _S_ubrequest keine Wirkung :-/
Das komische ist, dass es auf dem Webspace funktioniert, nur eben lokal nicht auf meinem Rechner.
Grüße,
Fabian St.
hi,
Wenn ich nun jedoch folgende .htaccess verwende, bleibt die rewrite_log leer und eine Anfrage von http://localhost/~fabi/info/links wird nicht an http://localhost/~fabi/info/index.php5?site=links weitergeleitet, sondern ich bekomme - wie gesagt - einen 404er
hast du zufällig ein wirklich existierendes verzeichnis namens "links" oder eine datei namens "links[.irgendeine_endung]" im verzeichnis /~fabi/info ...?
dann wärst du über MultiViews gestolpert, so wie ich auch seinerzeit.
gruß,
wahsaga
Hi wahsaga!
Vielen, vielen Dank wahsaga, das wars ;-)
hast du zufällig ein wirklich existierendes verzeichnis namens "links" oder eine datei namens "links[.irgendeine_endung]" im verzeichnis /~fabi/info ...?
Ja, links.inc.php ;-)
dann wärst du über MultiViews gestolpert, so wie ich auch seinerzeit.
Mensch, ich habe gesucht, aber diesen Thread muss ich übersehen haben :-/
Grüße,
Fabian St.
hi,
dann wärst du über MultiViews gestolpert, so wie ich auch seinerzeit.
Mensch, ich habe gesucht, aber diesen Thread muss ich übersehen haben :-/
da muss man ja auch erst mal drauf kommen - mir fiel das damals, wie du siehst, auch im traum nicht ein.
dabei ist es, wenn man's genauer bedenkt, nachvollziehbar - der apache wird halt in entscheidungsnöte gebracht, weil er nicht eindeutig weiß, was er tun soll.
eine andere art von fehlermeldung würde ich mir in dem falle allerdings besser vorstellen können ...
gruß,
wahsaga