%3F.png)
Me topé con un comportamiento extraño en mi nueva instalación virtual de Debian 11. En usuario/public_html estaba haciendo algunos cambios en una página y en algún momento mis navegadores comenzaron a descargar el archivo de índice en lugar de renderizarlo.
Pasó bastante tiempo antes de que me diera cuenta de que el problema era el archivo index.html.bak. Este era el archivo que se estaba descargando aunque tenía index.php en la carpeta.
Probé esto configurando DirectoryIndex en configuraciones y .htaccess y siempre puedo replicar el problema siempre que index.html esté configurado antes de index.php, y si DirectoryIndex no está configurado. Index.html.bak siempre se publica antes de index.php. Si index.php se configura primero en DirectoryIndex, entonces index.php se sirve correctamente.
Lo extraño es que esto sólo sucede bajo public_html, no bajo /var/www
No puedo replicar esto en mi antiguo servidor Debian con Apache más antiguo.
¿Es esto un error o es posible que tenga algunas configuraciones defectuosas? Apenas he tocado ninguna de las configuraciones desde esta nueva instalación.
La versión de Apache es
Server version: Apache/2.4.54 (Debian) Server built: 2022-06-09T04:26:43
Respuesta1
Módulo Apachemod_mime
Revise la mod_mime
configuración de Apache y lamod_mime
Documentación de Apache 2.4. En particular, MultiviewsMatch
la configuración de sus directivas y ladocumentación asociada.
Tenga en cuenta la siguiente advertencia extraída del mismo: permitir" Any
extensiones que coincidan, incluso si mod_mime
no reconoce la extensión"puede causar"Resultados impredecibles, como entrega .old
de .bak
archivos que el webmaster nunca esperó que se entregaran".
Módulo Apache
mod_mime
Este módulo se utiliza para asignar metadatos de contenido al contenido seleccionado para una respuesta HTTP.asignando patrones en el URI o nombres de archivos a los valores de metadatos. Por ejemplo, las extensiones de nombre de los archivos de contenido a menudo definen el tipo de medio de Internet, el idioma, el juego de caracteres y la codificación del contenido. Esta información se envía en mensajes HTTP que contienen ese contenido y se utiliza en la negociación de contenido al seleccionar alternativas, de modo que se respeten las preferencias del usuario al elegir uno de varios contenidos posibles para servir. Vermod_negociaciónpara más información sobrenegociación de contenidos.
Archivos con múltiples extensiones
Los archivos pueden tener más de una extensión; el orden de las extensiones esnormalmenteirrelevante. Por ejemplo, si el archivobienvenido.html.frse asigna al tipo de contenido texto/html y al idioma francés, luego el archivobienvenido.fr.htmlse asignará exactamente a la misma información.
Si prefiere que solo la última parte del nombre de archivo separada por puntos se asigne a una parte particular de metadatos, no utilice la opciónAgregardirectivas.
MultiviewsMatch
Directiva
// apache.org > 2.4 > mod_mime > multiviewsmatch
MultiviewsMatch
permite tres comportamientos diferentes paramod_negociaciónFunción de vistas múltiples:Any
NegotiatedOnly
Filters|Handlers
[Manejadores|Filtros]
Las vistas múltiples permiten que una solicitud de un archivo, por ejemplo
index.html
, coincida con cualquier extensión negociada después de la solicitud base, por ejemploindex.html.en
,index.html.fr
, oindex.html.gz
.La
NegotiatedOnly
opción establece que cada extensión que sigue al nombre base debe correlacionarse con unamod_mime
extensión reconocida para la negociación de contenido, por ejemplo, conjunto de caracteres, tipo de contenido, idioma o codificación. Esta es la implementación más estricta con la menor cantidad de efectos secundarios inesperados y es el comportamiento predeterminado.
Para incluir extensiones asociadas con
Handlers
y/oFilters
, establezca laMultiviewsMatch
directiva en Controladores, Filtros o ambas palabras clave de opción.
Finalmente podrá permitir
Any
que las extensiones coincidan, incluso simod_mime
no reconoce la extensión. Esto puede provocar resultados impredecibles, como la publicación.old
de.bak
archivos que el webmaster nunca esperó que se publicaran.
Respuesta2
Gracias al usuarioLa respuesta de los puntos ciegosPude resolver este misterio (al menos en su mayor parte) e implementar una configuración adecuada.
Respuestas a todas mis preguntas originales:
Si DirectoryIndex
index.html se ordenó antes que index.php, Apache primero priorizará index.html, luego versiones alternativas de index.html (p. ej., index.html.bak), antes de servir index.php si están ausentes.
En mi Apache mods-enabled/userdir.conf, Options MultiViews
ya estaba configurado de forma predeterminada. Esta opción habilita el uso de MultiviewsMatch
una directiva que permite servir archivos alternativos como foo.html.fr.
En mi configuración principal de Apache, apache2.conf, Options MultiViews
la opción NO estaba habilitada de forma predeterminada para /var/www, por eso el comportamiento en cuestión ocurría solo en los sitios public_html de los usuarios.
No sé por qué esta configuración predeterminada es diferente para estos dos.
Para los archivos .bak, el tipo mime application/x-trash
está configurado de forma predeterminada en Debian. Esta es la razón por la que los navegadores descargan los archivos .html.bak en lugar de renderizarlos.
Existe cierta inconsistencia entre lo que noté en Apache en mi sistema basado en Debian y la documentación de Apache:
documentos de Apache mod_mime.html#multiviewsmatch
Finalmente puedes permitir que cualquier extensión coincida, incluso si mod_mime no reconoce la extensión. Esto puede provocar resultados impredecibles, como la publicación de archivos .old o .bak que el webmaster nunca esperó que se publicaran.
De hecho, los archivos .old y .bak se entregan incluso cuando MultiviewsMatch NegotiatedOnly
están configurados. A esas extensiones de archivo se les asigna application/x-trash
el tipo mime en /etc/mime.types en Debian. Para mí, este comportamiento no tiene mucho sentido y también contradice la documentación, por lo que en cierto modo esto es en realidad un error.
Ahora, si no desea deshabilitarlo Multiviews
por completo pero desea deshabilitar el servicio de algunos tipos de archivos conocidos, puede eliminar sus tipos mime de Apache en mods-enabled/mime.conf usando, por ejemplo, RemoveType bak
y usando MultiviewsMatch NegotiatedOnly
.