Назад | Перейти на главную страницу

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

У меня возникла следующая проблема на хосте, использующем 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>