У меня возникла следующая проблема на хосте, использующем 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
enabled и 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, я мог бы регулярно обращаться к нему с помощью браузера с URL-адресом / admin / contents. Так что проблема только в файлах php. Есть какие-нибудь подсказки о том, что может привести к провалу переговоров?
Я нашел решение. Действительно, очень просто. Я забыл включить следующее:
AddType application/x-httpd-php .php
в раздел apache mod_mime в httpd.conf
Меня ввело в заблуждение то, что скрипты php работали правильно; однако согласование не удалось, потому что mod_negotiation ищет только "интересные" (и известные) типы файлов.
У меня была такая же проблема после обновления с 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
файл.
Вместо отображения .php
к типу носителя (который может иметь последствия для безопасности, как описано в Ошибка Debian 589384 которые отключили их), вы можете настроить MultiviewsMatch
для сопоставления файлов без типа для .php
, как предложено в Ответ Марка Амери на аналогичный вопрос:
<Files "*.php">
MultiviewsMatch Any
</Files>