¿Por qué index.html.bak tiene prioridad sobre index.php (Apache)?

¿Por qué index.html.bak tiene prioridad sobre index.php (Apache)?

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_mimeconfiguración de Apache y lamod_mimeDocumentación de Apache 2.4. En particular, MultiviewsMatchla configuración de sus directivas y ladocumentación asociada.

Tenga en cuenta la siguiente advertencia extraída del mismo: permitir" Anyextensiones que coincidan, incluso si mod_mimeno reconoce la extensión"puede causar"Resultados impredecibles, como entrega .oldde .bakarchivos que el webmaster nunca esperó que se entregaran".

Módulo Apachemod_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.

MultiviewsMatchDirectiva

// apache.org > 2.4 > mod_mime > multiviewsmatch

MultiviewsMatchpermite 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 ejemplo index.html.en, index.html.fr, o index.html.gz.

La NegotiatedOnlyopción establece que cada extensión que sigue al nombre base debe correlacionarse con una mod_mimeextensió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 Handlersy/o Filters, establezca la MultiviewsMatchdirectiva en Controladores, Filtros o ambas palabras clave de opción.

Finalmente podrá permitir Anyque las extensiones coincidan, incluso si mod_mimeno reconoce la extensión. Esto puede provocar resultados impredecibles, como la publicación .oldde .bakarchivos 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 DirectoryIndexindex.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 MultiViewsya estaba configurado de forma predeterminada. Esta opción habilita el uso de MultiviewsMatchuna directiva que permite servir archivos alternativos como foo.html.fr.

En mi configuración principal de Apache, apache2.conf, Options MultiViewsla 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-trashestá 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 NegotiatedOnlyestán configurados. A esas extensiones de archivo se les asigna application/x-trashel 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 Multiviewspor 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 baky usando MultiviewsMatch NegotiatedOnly.

información relacionada