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.html
archivo.
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.html
directamente? 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_rewrite
para 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?
/social
en su ejemplo.index.html
/social
. (Además, solo en general, no se desea servir el mismo contenido en varias URL).Respuestas:
Enviar los datos sin una redirección rompería los enlaces relativos. Si
http://server/directory
contienefile
, entonces la URL completa para eso seríahttp://server/directory/file
. Un enlace especificado como<a href="file">
apuntaráhttp://server/directory/file
si la URL base eshttp://server/directory/
, pero si la URL base fuera solohttp://server/directory
, apuntaría en suhttp://server/file
lugar, 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.html
archivo 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.
fuente
mod_dir
agrega esta redirección y puede deshabilitarla con unaDirectorySlash Off
directiva.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.
fuente