it-swarm.com.de

htaccess ErrorDocument 500 funktioniert nicht

Ich habe eine Site, deren .htaccess-Datei Folgendes enthält:

ErrorDocument 404 /errors/404.html
ErrorDocument 500 /errors/500.html

Die 404-Umleitung funktioniert einwandfrei, aber wenn ich auf einen 500 Internal Server Error stoße, wird anstelle von /errors/500.html die Standardmeldung Internal Server Error angezeigt. Es heißt auch

Bei dem Versuch, ein ErrorDocument zu verwenden, um die Anforderung zu verarbeiten, trat ein 500 Internal Server Error Fehler auf.

Weitere Informationen: Wenn ich einen abschließenden Schrägstrich auf einer .html-Seite eingebe, auf der die ".html" vom verbleibenden Teil der htaccess-Datei entfernt wurde, kann der Wert auf 500 gesetzt werden (z. B. wenn ich versuche, zu http://example.com/test/ zu navigieren, wo test tatsächlich ist test.html, dann erhalte ich einen internen Serverfehler):

#example.com/page will display the contents of example.com/page.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]

#302 from example.com/page.html to example.com/page
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.html\ HTTP/
RewriteRule ^(.*)\.html$ /$1 [R=302,L]
6
binaryfunt

wenn ich jedoch auf einen 500 Internal Server Error stoße, wird der Standard-Internal Server Error angezeigt

Das Problem ist, dass benutzerdefinierte 500 Fehlerdokumente einfach nicht für Fehler in .htaccess ausgelöst werden - und genau das passiert hier. Wie Aakash bereits zitiert hat, kann dies unter den Bereich einer "fehlerhaften Anfrage" fallen. Wenn Sie Ihr Fehlerprotokoll überprüfen, sollte es lauten: "core: error".

Tatsächlich ist es etwas schwierig, einen echten Fehler zu simulieren, der das benutzerdefinierte 500-Fehlerdokument auslöst.

Sie können jedoch manuell einen 500-Fehler auslösen, der Ihre benutzerdefinierte Fehlerbehandlungsroutine mit einer der folgenden Angaben aufruft:

RewriteRule ^ - [R=500]

Bei dem Versuch, ein ErrorDocument zu verwenden, um die Anforderung zu verarbeiten, trat ein 500 Internal Server Error Fehler auf.

Zugegebenermaßen ist der Wortlaut etwas verwirrend. Alle vom System generierten 500 Fehler scheinen jedoch denselben Text zu enthalten. Ich denke, es bedeutet nur, dass es nicht "die Anfrage behandeln" konnte ... es gab kein ErrorDocument, um die Anfrage zu behandeln, also hier ist ein catch-all 500 Internal Server Error. Was alles ist, dass ein 500er Fehler wirklich ... ein undefinierter Fehlerzustand ist, weil sonst nichts passt (Details finden Sie in Ihrem Server-Fehlerprotokoll).

Weitere Informationen: Wenn ich einen abschließenden Schrägstrich auf einer .html-Seite eingebe, auf der die ".html" entfernt wurde, kann ich erreichen, dass sie 500 wirft ...

Ich bin mir nicht sicher, ob dies wirklich Teil Ihrer Frage ist, aber dieser 500-Fehler ist das Ergebnis einer Umschreibeschleife. Speziell:

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]

Anfrage: http://example.com/test/ (mit dem zusätzlichen Schrägstrich)

In diesem Fall ist %{REQUEST_FILENAME}/path/to/test (kein abschließender Schrägstrich), daher ist die Bedingung %{REQUEST_FILENAME}.html -f wahr (/path/to/test.html existiert).

Der URL-Pfad, der vom Muster RewriteRule erfasst wird, enthält jedoch den abschließenden Schrägstrich, d. H. test/ - In diesem Fall ist es nicht dasselbe wie REQUEST_FILENAME. Die URL wird daher fälschlicherweise in test/.html umgeschrieben.

Und das Umschreiben beginnt wieder von vorne (weil sich die URL geändert hat) ... test/.html.html, test/.html.html.html usw. (Weil REQUEST_FILENAME immer /path/to/test ist.)

2
MrWhite

Ich würde zwei Dinge versuchen -

  1. Überprüfen Sie die Berechtigungen von 500.html (stellen Sie sie auf 777 ein, um ganz sicher zu sein - ändern Sie sie später).

  2. Versuchen Sie 500.htm (oder 500.txt) anstelle von 500.html (nur um sicherzugehen, dass Ihre anderen Regeln in htaccess die Seite ErrorDocument 500.html nicht verfälschen). Denken Sie auch daran, die Regel htaccess ErrorDocument in 500.htm (oder 500.txt) zu ändern.

Außerdem laut http://httpd.Apache.org/docs/2.4/mod/core.html#errordocument

Obwohl die meisten Fehlermeldungen überschrieben werden können, gibt es bestimmte Umstände, in denen die internen Meldungen unabhängig von der Einstellung von ErrorDocument verwendet werden. Insbesondere wenn eine fehlerhafte Anforderung erkannt wird, wird die normale Anforderungsverarbeitung sofort angehalten und die interne Fehlermeldung zurückgegeben. Dies ist erforderlich, um Sicherheitsproblemen vorzubeugen, die durch fehlerhafte Anforderungen verursacht werden.

Versuchen Sie es auf andere Weise, um 500 Fehler zu simulieren.

2
Aakash