Ошибка согласования файла Apache

23

У меня возникла следующая проблема на хосте с использованием Apache 2.2.22 + PHP 5.4.0

Мне нужно предоставить файл, /home/server1/htdocs/admin/contents.phpкогда пользователь делает запрос:, http://server1/admin/contentsно я получаю это сообщение на сервере error_log.

Negotiation: discovered file(s) matching request: /home/server1/htdocs/admin/contents (None could be negotiated)

Обратите внимание, что я mod_negotiationвключил и MultiViews среди вариантов для соответствующего виртуального хоста:

<Directory "/home/server1/htdocs">
    Options Indexes Includes FollowSymLinks MultiViews
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>

Я также использую mod_rewrite, со следующими .htaccessправилами:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^\./]*)$ index.php?t=$1 [L]
</IfModule>

Это кажется очень странным, но на той же коробке с PHP 5.3.6 он работал правильно. Я просто пытаюсь обновить до PHP 5.4.0, но я не могу решить эту проблему переговоров. Любая идея о том, почему Apache не может соответствовать contents.phpпри запросе content(что должно быть, что должно делать mod_negotiation)?

ОБНОВЛЕНИЕ: я заметил, что mod_negotiation работает правильно с файлами с расширением, отличным от .php: поэтому, если бы у меня был файл с именем /admin/contents.txt, я мог бы обращаться к нему регулярно с помощью браузера с / admin / contents url. Так что проблема только для php файлов. Любая подсказка о том, что может привести к провалу переговоров?

lorenzo.marcon
источник
Как вы настраиваете mod_negotiation? Вы используете это?
Мирча Вутцовичи
Ну, я просто включаю mod_negotiation в httpd.conf, тогда вариантов MultiViews в VirtualHost должно быть достаточно, чтобы делать то, что я ищу, насколько я знаю ... не так ли?
lorenzo.marcon
3
FWIW, у меня была эта проблема с +MultiViewsвключенным, и она исчезла после его отключения.
Феликс Фрэнк

Ответы:

39

Я нашел решение. Очень просто. Я забыл включить следующее:

AddType application/x-httpd-php .php

в раздел apache mod_mime в httpd.conf

Я был введен в заблуждение тем фактом, что php-скрипты работали правильно; однако согласование было неудачным, потому что mod_negotiation ищет только «интересные» (и известные) типы файлов.

lorenzo.marcon
источник
3
Это! Это право ЗДЕСЬ! Большую часть ночи выискивали, почему я получаю очень бесполезную ошибку «Обнаружены файлы / нет». Раньше скрипты работали нормально, и у меня было чертовски время отследить тот факт, что тип не был включен в mod_mime в дистрибутиве, на котором я тестировал. Я должен вам пиво, сэр.
Akoi Meexx
Я с радостью приму ваше пиво, когда приеду в США :)
lorenzo.marcon
это работает отлично !! @ lorenzo.marcon спасибо за вопрос и ответ!
rogcg
Это должно было измениться в какой-то момент. Я чувствую себя довольно уверенно, мне не нужно было добавлять это раньше для php MultiViews для работы.
user1338062
Спасибо, метрическая тонна! Я бился головой о стену, удивляясь, почему мой мод не переписал с search /? $ На search.php. Кажется, модуль согласования имеет приоритет перед модулем перезаписи, что, как правило, полезно знать.
zəəs uɐɟəʇs 19.10-18
12

У меня была такая же проблема после обновления с Debian Squeeze до Wheezy. mods-enabled/mime.confВключает в себя известные типы файлов из системы:

TypesConfig /etc/mime.types

Проблема заключалась в том, что /etc/mime.typesфайл был заменен обновлением, а в замененном файле была закомментирована часть PHP. При поиске я обнаружил:

#application/x-httpd-php                        phtml pht php
#application/x-httpd-php-source                 phps
#application/x-httpd-php3                       php3
#application/x-httpd-php3-preprocessed          php3p
#application/x-httpd-php4                       php4
#application/x-httpd-php5                       php5

Мне пришлось удалить #из каждой строки, содержащей php-релевантные материалы, затем сохранить и перезапустить веб-сервер Apache. Это решило проблему без изменения mime.confфайла.

derHippeChip
источник
Это спасло меня после 4 часов бесконечной отладки против призрака.
MarkSkayff
Имейте в виду, что выполнение этого может привести к libapache-mod-php5выполнению исполняемых файлов с .phpименем (например filename.php.jpeg), которое было исходным обоснованием для их комментирования. См. Bugs.debian.org/589384
Кевиноид
0

Вместо сопоставления .phpс типом носителя (который может иметь последствия для безопасности, как описано в Debian Bug 589384, который их отключил), вы можете настроить MultiviewsMatchсопоставление файлов без типа для .php, как это предлагается в ответе Марка Амери на аналогичный вопрос :

<Files "*.php">
    MultiviewsMatch Any
</Files>
Kevinoid
источник