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文件。关于什么会使谈判失败的任何线索?


您如何配置mod_negotiation?你在用吗?
Mircea Vutcovici 2012年

好吧,我只在httpd.conf中包含mod_negotiation,那么据我所知,VirtualHost中的MultiViews选项应该足以完成我想要的工作。不是吗?
lorenzo.marcon 2012年

3
FWIW,我在+MultiViews启用时遇到了这个问题,并且在禁用它后消失了。
菲利克斯·弗兰克

Answers:


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 2013年

谢谢吨!我正把头撞在墙上,想知道为什么我的mod从search /?$重写为search.php无法正常工作。协商模块似乎优先于重写模块,而重写模块通常是众所周知的。
zıəsuɐɟəʇ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 Web服务器。这样就解决了问题,而无需修改mime.conf文件。


经过4小时无休止的幽灵调试后,这为我节省了时间。
MarkSkayff

请注意,这样做可能会使libapache-mod-php5执行文件.php的名称(如filename.php.jpeg)成为注释文件的原始理由。参见bugs.debian.org/589384
Kevinoid

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.