Apache HTTPD 2.4.x: ¿Cómo "dirigir" a los usuarios a una página de error personalizada si ciertos caracteres están presentes en la URL/URI?

Apache HTTPD 2.4.x: ¿Cómo "dirigir" a los usuarios a una página de error personalizada si ciertos caracteres están presentes en la URL/URI?

Entonces tengo esta configuración de Apache en la que intento "reescribir" a los usuarios en una página de error personalizada pero no funciona. Entré http://localhost/index.html/ddgdg%:sdsdfsen el navegador y no apareció mi página de error.

Puedo ver la página de error personalizada ingresando directamente su URL en el navegador ( http://localhost/my-error.html).

¿Alguna idea de qué podría estar haciendo mal?


mi httpd.conf completo:enlace a httpd.conf


mis cambios al httpd.conf predeterminado(También tuve que descomentar LoadModule para mod_rewrite.so)

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]

Contenido de la página de error personalizada.

$ cat /Library/WebServer/Documents/my-error.html 
<html><body><h1>404 error here</h1></body></html>

versión apache

$ apachectl -v
Server version: Apache/2.4.34 (Unix)
Server built:   Feb 22 2019 20:20:11

editar1:Actualmente estoy ejecutando macOS Mojave, pero configuraré una máquina virtual Ubuntu dentro de un tiempo.

Respuesta1

Hay algunos problemas diferentes sucediendo aquí...

http://localhost/index.html/ddgdg%:sdsdfs

En realidad, no ha indicado qué respuesta está obteniendo, solo cuál esno esta pasando. Sin embargo, debido al error %(que no precede a un octeto codificado hexadecimal), esta URL no es estrictamente válida y esperaría que Apache respondiera con un archivo 400 Bad Request. La única forma de anular esto es crear un documento de error 400 personalizado en el que verifique la URL solicitada y personalice la respuesta. Por ejemplo:

ErrorDocument 400 /my-error.html

Si no fuera por el extraviado, %deberías poder detectar esta solicitud usando mod_rewrite y redirigirla en consecuencia. Sin embargo, RewriteRuleestá buscando una ruta URL vacía (es decir, "^/$"), mientras que la URL solicitada en su ejemplo está lejos de estar vacía (es decir, /index.html/ddgdg%:sdsdfs), por lo que la RewriteRuledirectiva nunca coincidirá con su URL de ejemplo. Para buscar %o :en cualquier lugar de la ruta URL y redirigir, puede hacer algo como lo siguiente:

# Checks for a "%" or ":" in the URL-path
RewriteRule [%:] /my-error.html [L,R=302]

Pero tenga en cuenta que la ruta URL que coincide con elRewriteRule patrón(así como la REQUEST_URIvariable del servidor) ya está % decodificada, por lo que esto solo coincidirá con las URL donde los caracteres especiales se hayan codificado doblemente (poco común). (Como se señaló anteriormente, un extraviado %probablemente generará una respuesta de 400antesmod_rewrite puede procesar la solicitud).

También me preguntaría por qué desea "redireccionar" a su documento de error personalizado (es decir, my-error.html) y no publicarlo directamente. La redirección tiene una serie de desventajas: respuesta 3xx enviada al cliente, pérdida de información sobre la URL que causó el error, duplicación de las solicitudes a su servidor, etc.

Tú podríasreescribir internamentela solicitud a /my-error.html, en lugar de redirigir, simplemente eliminando la Rbandera. Por ejemplo:

RewriteRule [%:] /my-error.html [L]

Pero, a menos que establezca manualmente el estado HTTP, my-error.htmlel usuario verá una 200 OKrespuesta, lo cual no es deseable.

O (preferiblemente) cree un 404 personalizado (que se parezca a lo que está intentando hacer) y actívelo en su lugar. Por ejemplo:

ErrorDocument 404 /my-error.html

RewriteRule [%:] - [R=404]

Luego, Apache establece el estado de respuesta HTTP "404 No encontrado".

Sin embargo, probablemente no necesites usar mod_rewrite aquí. En su URL de ejemplo, todo lo que sigue index.htmlen la ruta URL, es decir/ddgdg%:sdsdfs , esinformación adicional de nombre de ruta(también conocido como información de ruta / PATH_INFO). De forma predeterminada, el controlador que procesa respuestas de texto/html no permite información de ruta e implícitamente activará un 404 (si no fuera por el mensaje callejero %, como se discutió anteriormente), llamando a su personalizado ErrorDocument(si está definido). Por lo tanto, la RewriteRuledirectiva del último ejemplo puede simplemente eliminarse, ya que Apache activará un 404 de todos modos (a menos que anule este comportamiento con AcceptPathInfo).

información relacionada