Не вдалося узгодити файл 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 серед варіантів відповідного virtualhost:

<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 / content. Тож проблема полягає лише у файлах php. Будь-яка підказка про те, що може змусити переговори провалитися?


Як налаштувати 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 шукає лише "цікаві" (і відомі) типи файлів.


3
Це! Це право ТУТ! Більшу частину ночі провів, переслідуючи, чому я отримував дуже непомітну помилку "Виявлений файл / жодні переговори". Раніше сценарії працювали чудово, і в мене був чорт часу, який відстежував той факт, що тип не був включений до mod_mime в дистрибутиві, на якому я тестував. Я завдячую вам пивом, сер.
Akoi Meexx

Я з радістю прийму ваше пиво, коли я приїду в США :)
lorenzo.marcon

це прекрасно працює !! @ lorenzo.marcon дякую за запитання та відповідь!
rogcg

Це, мабуть, змінилося в якийсь момент. Я впевнений, що мені не потрібно було додавати це раніше, щоб php MultiViews працювала.
user1338062

Дякую метричній тоні! Я стукав головою об стіну, цікавившись, чому мій мод переписати з search /? $ На search.php не працює. Здається, що модуль переговорів має перевагу перед модулем перезапису, який, як правило, добре знати.
zıəs uɐɟəʇs

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файл.


Це врятувало мене після 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.