%3F.png)
Я столкнулся со странным поведением моей новой виртуальной установки 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
, которые веб-мастер никогда не ожидал».
Модуль Apache
mod_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Мне удалось разгадать эту загадку (по крайней мере, большую ее часть) и реализовать подходящую конфигурацию.
Ответы на все мои первоначальные вопросы:
Если DirectoryIndex
index.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
.