
also ich habe diese Apache-Konfiguration, in der ich versuche, Benutzer auf eine benutzerdefinierte Fehlerseite „umzuschreiben“, aber es funktioniert nicht. Ich habe es http://localhost/index.html/ddgdg%:sdsdfs
im Browser eingegeben und meine Fehlerseite nicht erhalten.
Ich kann die benutzerdefinierte Fehlerseite anzeigen, indem ich ihre URL direkt in den Browser eingebe ( http://localhost/my-error.html
).
Irgendwelche Ideen, was ich falsch machen könnte?
meine vollständige httpd.conf:Link zu httpd.conf
meine Änderungen an der Standard-httpd.conf(Ich musste auch das LoadModule für mod_rewrite.so auskommentieren)
RewriteEngine On
LogLevel alert rewrite:info
#if invalid characters are present in the URI, display 404 page
RewriteCond %{REQUEST_URI} ^\/.+[:%].+
RewriteRule "^/$" "http://%{SERVER_NAME}/my-error.html" [L,R=301]
Inhalt der benutzerdefinierten Fehlerseite
$ cat /Library/WebServer/Documents/my-error.html
<html><body><h1>404 error here</h1></body></html>
Apache-Version
$ apachectl -v
Server version: Apache/2.4.34 (Unix)
Server built: Feb 22 2019 20:20:11
Bearbeitung1:Im Moment läuft macOS Mojave, aber ich werde in Kürze eine Ubuntu-VM einrichten.
Antwort1
Hier treten verschiedene Probleme auf ...
http://localhost/index.html/ddgdg%:sdsdfs
Sie haben nicht gesagt, welche Antwort Sie erhalten, sondern nur, waspassiert nicht. Aufgrund des Streuzeichens %
(das keinem hexadezimal codierten Oktett vorangeht) ist diese URL jedoch streng genommen ungültig und ich würde erwarten, dass Apache mit einem antwortet 400 Bad Request
. Die einzige Möglichkeit, dies zu umgehen, besteht darin, ein benutzerdefiniertes 400-Fehlerdokument zu erstellen, in dem Sie die angeforderte URL überprüfen und die Antwort anpassen. Beispiel:
ErrorDocument 400 /my-error.html
Wenn der Streuner nicht wäre, %
sollten Sie diese Anfrage mit mod_rewrite abfangen und entsprechend umleiten können. Sie RewriteRule
suchen jedoch nach einem leeren URL-Pfad (z. B. "^/$"
), während die angeforderte URL in Ihrem Beispiel alles andere als leer ist (z. B. /index.html/ddgdg%:sdsdfs
) – daher wird die RewriteRule
Anweisung nie mit Ihrer Beispiel-URL übereinstimmen. Um nach einem %
oder :
irgendwo im URL-Pfad zu suchen und umzuleiten, könnten Sie etwa Folgendes tun:
# Checks for a "%" or ":" in the URL-path
RewriteRule [%:] /my-error.html [L,R=302]
Beachten Sie jedoch, dass der URL-Pfad, der mit demRewriteRule
Muster(ebenso wie die REQUEST_URI
Servervariable) ist bereits %-dekodiert, daher werden nur URLs gefunden, bei denen Sonderzeichen doppelt kodiert wurden (selten). (Wie oben erwähnt, %
wird ein ansonsten unkorrekter Wert wahrscheinlich eine 400-Antwort erzeugen .Vormod_rewrite kann die Anfrage verarbeiten.)
Ich würde auch fragen, warum Sie zu Ihrem benutzerdefinierten Fehlerdokument (z. B. my-error.html
) „umleiten“ und es nicht direkt bereitstellen möchten. Die Umleitung hat eine Reihe von Nachteilen: 3xx-Antwort an den Client gesendet, Informationen bezüglich der URL, die den Fehler verursacht hat, verloren gegangen, die Anfragen an Ihren Server verdoppelt usw.
Sie könntenintern umschreibendie Anfrage an /my-error.html
, anstatt sie umzuleiten, indem Sie einfach das R
Flag entfernen. Beispiel:
RewriteRule [%:] /my-error.html [L]
Wenn Sie den HTTP-Status jedoch nicht manuell festlegen, my-error.html
wird dem Benutzer eine Antwort angezeigt 200 OK
, was nicht wünschenswert ist.
ODER (besser) erstellen Sie eine benutzerdefinierte 404 (die so aussieht, wie Sie es versuchen) und lösen Sie diese stattdessen aus. Beispiel:
ErrorDocument 404 /my-error.html
RewriteRule [%:] - [R=404]
Apache setzt dann den HTTP-Antwortstatus „404 Nicht gefunden“.
Allerdings müssen Sie mod_rewrite hier wahrscheinlich gar nicht verwenden. In Ihrer Beispiel-URL ist alles nach index.html
im URL-Pfad, nämlich /ddgdg%:sdsdfs
,zusätzliche Pfadnameninformationen(auch bekannt als Pfadinfo / PATH_INFO
). Standardmäßig lässt der Handler, der Text-/HTML-Antworten verarbeitet, keine Pfadinfo zu und löst implizit eine 404 aus (wenn es nicht den Streuner gäbe %
– wie oben beschrieben) und ruft Ihre benutzerdefinierte Anweisung auf ErrorDocument
(falls definiert). Daher RewriteRule
kann die Direktive im letzten Beispiel einfach entfernt werden, da Apache sowieso eine 404 auslöst (es sei denn, Sie überschreiben dieses Verhalten mit AcceptPathInfo
).