Zur Navigation

.htaccess: Problem mit ErrorDocument und mod_rewrite

1 Gast (Gast)

Hallo,

ich habe folgende RewriteRule in meiner .htaccess:
RewriteCond %{HTTP_HOST} ^[-.0-9a-z]*example\.com$
RewriteCond %{REQUEST_URI} !^/html/
RewriteRule (.*) /html/$1
Diese Regel funktioniert auch so wie sie soll. Ein Problem tritt allerdings auf, wenn ich mittels
ErrorDocument 404 /errors/404.php
versuche, ein ErrorDocument festzulegen. Wenn ich dann nämlich eine nicht existierende Unterseite oder Unterordner aufrufe (z.B. example.com/something.php) bekomme ich die Standard Apache-Fehlerseite, die mir mitteilt, dass die aufgerufene Seite und mein ErrorDocument nicht gefunden wurde.
The requested URL /html/something.php was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
Des Weiteren ist mir aufgefallen, dass wenn ich nach der RewriteRule oben noch eine andere RewriteRule einsetze, beispielsweise
RewriteRule ^([^/.]+)/$ /abc/index.php?p=$1 
folgender Fehler ausgegeben wird:
The requested URL /html/abc/index.php was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
Allerdings soll diese RewriteRule eigentlich nicht unterhalb von /html/ rewriten, sondern vom "Stammverzeichnis" aus, da /abc dort auf der gleichen Ebene wie /html liegt.

Ich hoffe, dass irgendjemand hier einen Lösungsansatz für dieses Problem hat.
Vielen Dank im Voraus für die Antworten

12.06.2013 19:02

2 Jörg Kruse

Zitat von Gast
ich habe folgende RewriteRule in meiner .htaccess:
RewriteCond %{HTTP_HOST} ^[-.0-9a-z]*example\.com$
RewriteCond %{REQUEST_URI} !^/html/
RewriteRule (.*) /html/$1
Diese Regel funktioniert auch so wie sie soll. Ein Problem tritt allerdings auf, wenn ich mittels
ErrorDocument 404 /errors/404.php
versuche, ein ErrorDocument festzulegen. Wenn ich dann nämlich eine nicht existierende Unterseite oder Unterordner aufrufe (z.B. example.com/something.php) bekomme ich die Standard Apache-Fehlerseite, die mir mitteilt, dass die aufgerufene Seite und mein ErrorDocument nicht gefunden wurde.
The requested URL /html/something.php was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

Ich würde hier mit einer zusätzlichen RewriteCond das Verzeichnis /errors/ vom Rewrite ausnehmen

RewriteCond %{REQUEST_URI} !^/errors/

Des Weiteren ist mir aufgefallen, dass wenn ich nach der RewriteRule oben noch eine andere RewriteRule einsetze, beispielsweise
RewriteRule ^([^/.]+)/$ /abc/index.php?p=$1 
folgender Fehler ausgegeben wird:
The requested URL /html/abc/index.php was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
Allerdings soll diese RewriteRule eigentlich nicht unterhalb von /html/ rewriten, sondern vom "Stammverzeichnis" aus, da /abc dort auf der gleichen Ebene wie /html liegt.

Die Rules werden nacheinander abgearbeitet, eine nachfolgende Rule wird dann u.U. auf das Ergebnis einer vorangehenden Rule angewandt und nicht mehr auf den ursprüngliche REQUEST_URI. Du kannst aber mit einem [L] Flag eine Rule als "last" Rule kennzeichnen, d.h. wenn diese Rule zutrifft, keine weiteren mehr angewandt werden. Diese Rule sollte dann wohl auch weiter oben stehen:

RewriteRule ^([^/.]+)/$ /abc/index.php?p=$1 [L]

12.06.2013 19:41 | geändert: 12.06.2013 19:41

3 Gast (Gast)

Hallo Jörg,

vielen Dank schonmal, ErrorDocument funktioniert jetzt :). Allerdings habe ich beim zweiten Problem den Eindruck, dass das L-Flag einfach ignoriert wird, da genau die gleiche Meldung kommt wie vorher, dass /html/abc/index.php nicht gefunden wurde, obwohl ich diese Rule jetzt über allen anderen platziert habe.

Hoffe du hast noch eine Idee :)

12.06.2013 20:18

4 Horst_M

Zitat von Gast
Allerdings habe ich beim zweiten Problem den Eindruck, dass das L-Flag einfach ignoriert wird, da genau die gleiche Meldung kommt wie vorher, dass /html/abc/index.php nicht gefunden wurde, obwohl ich diese Rule jetzt über allen anderen platziert habe.

Was wohl normal ist, weil die Regel ja greifen kann, wenn ich es richtig verstanden habe und Du die oberhalb eingefügt hast. Habe jetzt nichts getestet, schaut nur im Augenblick für mich so aus.

RewriteRule ^([^/.]+)/$ /abc/index.php?p=$1 [L]

RewriteCond %{HTTP_HOST} ^[-.0-9a-z]*example\.com$
RewriteCond %{REQUEST_URI} !^/html/
RewriteRule (.*) /html/$1 [L]

Da kommt halt so etwas bei heraus in dieser Reihenfolge wie /html/abc/index.php, falls ich nicht gerade einen Denkfehler haben sollte. Da müsstest Du dann halt, wie Jörg bereits schrieb, abc mit als Ausnahme aufnehmen.

RewriteRule ^([^/.]+)/$ /abc/index.php?p=$1 [L]

RewriteCond %{HTTP_HOST} ^[-.0-9a-z]*example\.com$
RewriteCond %{REQUEST_URI} !^/html/
RewriteCond %{REQUEST_URI} !^/abc/
RewriteRule (.*) /html/$1 [L]

12.06.2013 21:53 | geändert: 12.06.2013 21:54

5 Gast (Gast)

Vielen, vielen Dank jetzt funktioniert alles!

12.06.2013 22:11

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]