Почему index.html.bak имеет приоритет над index.php (Apache)?

Почему index.html.bak имеет приоритет над index.php (Apache)?

Я столкнулся со странным поведением моей новой виртуальной установки Debian 11. В user/public_html я вносил некоторые изменения на страницу, и в какой-то момент мои браузеры начали загружать файл индекса вместо того, чтобы отображать его.

Прошло довольно много времени, прежде чем я понял, что проблема была в файле index.html.bak. Это был файл, который загружался, хотя у меня в папке был index.php.

Я проверил это, установив DirectoryIndex в конфигах и .htaccess, и я всегда могу воспроизвести проблему, когда index.html установлен перед index.php, и если DirectoryIndex не установлен. Index.html.bak всегда обслуживается перед index.php. Если index.php установлен первым в DirectoryIndex, то index.php обслуживается правильно.

Странно, что это происходит только в public_html, а не в /var/www.

Я не могу повторить это на моем старом сервере Debian со старым Apache.

Это баг или у меня какие-то неисправные конфигурации? Я почти не трогал конфигурации с момента этой новой установки.

Версия Apache Server version: Apache/2.4.54 (Debian) Server built: 2022-06-09T04:26:43

решение1

Модуль Apachemod_mime

Пожалуйста, проверьте настройки Apache mod_mimeиmod_mimeДокументация Apache 2.4. В частности, ваши MultiviewsMatchнастройки директив исопутствующая документация.

Обратите внимание на следующее предупреждение, взятое из того же источника: разрешение" Anyрасширения для сопоставления, даже если mod_mimeне распознает расширение"может вызвать«непредсказуемые результаты, такие как обслуживание .oldфайлов .bak, которые веб-мастер никогда не ожидал».

Модуль Apachemod_mime
Этот модуль используется для назначения метаданных контенту, выбранному для HTTP-ответа.путем сопоставления шаблонов в URI или именах файлов со значениями метаданных. Например, расширения файлов контента часто определяют тип интернет-носителя контента, язык, набор символов и кодировку контента. Эта информация отправляется в HTTP-сообщениях, содержащих этот контент, и используется в согласовании контента при выборе альтернатив, так что предпочтения пользователя учитываются при выборе одного из нескольких возможных контентов для обслуживания. См.mod_negotiationдля получения дополнительной информации осогласование содержания.

Файлы с несколькими расширениями

Файлы могут иметь более одного расширения; порядок расширений следующий:обычноне имеет значения. Например, если файлwelcome.html.frсопоставляется с типом содержимого text/html и языком French, затем файлwelcome.fr.htmlбудет отображаться на точно такой же информации.

Если вы предпочитаете, чтобы только последняя часть имени файла, разделенная точкой, была сопоставлена ​​с определенным фрагментом метаданных, то не используйтеДобавлятьдирективы.

MultiviewsMatchДиректива

// apache.org > 2.4 > mod_mime > multiviewsmatch

MultiviewsMatchдопускает три различных поведения дляmod_negotiationФункция Multiviews:Any   NegotiatedOnly   Filters|Handlers [Обработчики|Фильтры]

Multiviews позволяет запрашивать файл, например index.html, для сопоставления любых согласованных расширений, следующих за базовым запросом, например index.html.en, index.html.fr, или index.html.gz.

Опция NegotiatedOnlyпредусматривает, что каждое расширение, следующее за базовым именем, должно соответствовать распознаваемому mod_mimeрасширению для согласования контента, например, Charset, Content-Type, Language или Encoding. Это самая строгая реализация с наименьшим количеством неожиданных побочных эффектов, и это поведение по умолчанию.
 

Чтобы включить расширения, связанные с Handlersи/или Filters, задайте MultiviewsMatchдля директивы одно из следующих ключевых слов: Handlers, Filters или оба.

Наконец, вы можете разрешить Anyсопоставление расширений, даже если mod_mimeне распознает расширение. Это может привести к непредсказуемым результатам, таким как обслуживание .oldфайлов .bak, которые веб-мастер никогда не ожидал.

решение2

Спасибо пользователюОтвет Blind SpotsМне удалось разгадать эту загадку (по крайней мере, большую ее часть) и реализовать подходящую конфигурацию.

Ответы на все мои первоначальные вопросы:

Если DirectoryIndexindex.html упорядочен до index.php, Apache сначала отдаст приоритет index.html, затем альтернативным версиям index.html (например, index.html.bak), прежде чем обслуживать index.php, если они отсутствуют.

В моем Apache mods-enabled/userdir.conf Options MultiViewsуже был установлен по умолчанию. Эта опция позволяет использовать MultiviewsMatchдирективу, которая позволяет обслуживать альтернативные файлы, такие как foo.html.fr.

В моей основной конфигурации Apache apache2.conf Options MultiViewsопция НЕ была включена по умолчанию для /var/www, поэтому рассматриваемое поведение наблюдалось только на сайтах public_html пользователей.

Я не знаю, почему эта настройка по умолчанию для этих двух устройств разная.

Для файлов .bak тип mime application/x-trashустановлен по умолчанию в Debian. Вот почему браузеры загружают файлы .html.bak вместо того, чтобы рендерить их.

Между тем, что я заметил в Apache на моей системе на базе Debian, и документацией Apache есть некоторые несоответствия:

документы apache mod_mime.html#multiviewsmatch

Наконец, вы можете разрешить соответствие Any extensions, даже если mod_mime не распознает расширение. Это может привести к непредсказуемым результатам, таким как обслуживание файлов .old или .bak, которые веб-мастер никогда не ожидал.

На самом деле файлы .old и .bak обслуживаются даже при MultiviewsMatch NegotiatedOnlyнастройке. Этим расширениям файлов назначается application/x-trashтип mime в /etc/mime.types на Debian. Для меня такое поведение не имеет особого смысла, и оно также противоречит документации, так что в некотором смысле это на самом деле ошибка.

Теперь, если вы не хотите отключать Multiviewsполностью, но хотите отключить обслуживание некоторых известных типов файлов, вы можете удалить их типы MIME из Apache в mods-enabled/mime.conf, используя, например, RemoveType bakи используя MultiviewsMatch NegotiatedOnly.

Связанный контент