Apache2 - 301 Redirect cuando falta "/" al final del directorio en la url

13

Realmente no he notado este Redirect (301) al solicitar una URL como esta sin barra diagonal ("/") al final: http://server/directory

El servidor responderá con un encabezado permanente de redireccionamiento 301 con un encabezado de ubicación ubicado en http://server/directory/.

Vea este ejemplo en vivo:

Solicitud del usuario:

GET /social HTTP/1.1
( http://192.168.1.111/social )

Respuesta del servidor Apache:

HTTP/1.1 301 Moved Permanently
Location: http://192.168.1.111/social/

Solicitud del usuario:

GET /social/ HTTP/1.1
( http://192.168.1.111/social/ )

Respuesta del servidor Apache:

HTTP/1.1 200 OK

Apache access.log:

192.168.1.130 - - [05/Apr/2014:22:06:47 +0200] "GET /social HTTP/1.1" 301 558 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"
-
192.168.1.130 - - [05/Apr/2014:22:06:47 +0200] "GET /social/ HTTP/1.1" 200 942 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"

El directorio / social / contiene un index.htmlarchivo.

Software Apache: Apache/2.2.22 (Ubuntu)
Opciones de directorio:Options Indexes FollowSymLinks MultiViews

Entonces, mi pregunta es: ¿por qué apache está haciendo esto? ¿Y cómo evitar la redirección y enviar index.htmldirectamente? Los clientes tienen que enviar dos solicitudes, lo cual es realmente innecesario. Y tal vez algunos de los clientes no permiten redireccionamientos y no podrán ir al sitio sin la barra diagonal final ("/").

No quiero deshabilitar la redirección. Quiero que el servidor envíe la respuesta directamente sin ningún redireccionamiento. Incluso cuando lo solicite /social.

¿Apache está diseñado para redirigir esas solicitudes? El servidor podría enviar los datos sin redireccionar, ¿verdad? ¿Debo usar el mod_rewritepara evitar esto? U otra configuración? ¿O debería dejar que sea así y agregar una barra al final de todos los enlaces html y vivir con algunos redireccionamientos?

¿Qué piensan ustedes?

Jonathan Gurebo
fuente
Creo que tendrá que aclarar por qué desea deshabilitar esto. La única alternativa sensata a la redirección sería responder con 404 /socialen su ejemplo.
Håkan Lindqvist
No quiero deshabilitarlo, solo evitar la redirección. Me gustaría que el servidor index.html
produjera
Por "esto" me refería al comportamiento normal con una redirección de la URL incorrecta a la URL correcta. Vea la respuesta de @kasperd para conocer algunas de las razones por las cuales sería una mala idea publicar el contenido, por ejemplo /social. (Además, solo en general, no se desea servir el mismo contenido en varias URL).
Håkan Lindqvist

Respuestas:

10

Enviar los datos sin una redirección rompería los enlaces relativos. Si http://server/directorycontiene file, entonces la URL completa para eso sería http://server/directory/file. Un enlace especificado como <a href="file">apuntará http://server/directory/filesi la URL base es http://server/directory/, pero si la URL base fuera solo http://server/directory, apuntaría en su http://server/filelugar, que no es el resultado deseado.

Apache podría haber generado la lista de directorios de dos maneras diferentes dependiendo de la URL en lugar de redirigir. Sin embargo, eso no funcionaría si hubiera un index.htmlarchivo en el directorio. Entonces, en cambio, Apache está utilizando el enfoque, que funciona en ambos casos.

Este no es un comportamiento nuevo, hace una década Apache se comportaba de la misma manera. Los clientes que no pueden manejar una redirección ya deberían haberse solucionado. Pero para cualquier cliente que no pueda manejar una redirección, Apache debería enviar un pequeño archivo html con un enlace que se pueda seguir.

kasperd
fuente
Esto no responde la pregunta. Es correcto, que los enlaces relativos podrían romperse. Pero si alguien quiere entregar contenido para una ruta sin una barra inclinada final, entonces podrían tener razones para eso, por ejemplo, cuando se envía una solicitud POST a un servicio web. No hay enlaces relativos en los servicios web, y una redirección hará que el cuerpo POST se pierda.
dr fu manchu
9

mod_diragrega esta redirección y puede deshabilitarla con una DirectorySlash Offdirectiva.

Sin embargo, tenga en cuenta que deshabilitar la redirección de barra diagonal final podría ocasionar que algunas páginas se rompan. Si la página que se devuelve contiene enlaces relativos, esas URL se resolverían de manera diferente si la página se sirve sin la barra diagonal final.

200_success
fuente