我在使用 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,但我无法解决这个协商问题。你知道为什么 Apachecontents.php
在请求时无法匹配content
吗(这应该是 mod_negotiation 应该做的)?
更新:我注意到 mod_negotiation 可以正确处理扩展名不同于 .php 的文件:因此,如果我有一个名为 /admin/contents.txt 的文件,我可以使用浏览器通过 /admin/contents url 定期访问它。因此,问题只出现在 php 文件中。有什么线索可以说明什么会导致协商失败吗?
答案1
我找到了解决方案。确实非常简单。我忘了包含以下内容:
AddType application/x-httpd-php .php
进入 apache mod_mime 部分进入 httpd.conf
我被 php 脚本正确运行的事实误导了;然而协商失败了,因为 mod_negotiation 只寻找“有趣的”(已知的)文件类型。
答案2
从 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
。
答案3
而不是映射.php
到媒体类型(这可能会产生安全隐患,如Debian 错误 589384禁用它们),您可以配置MultiviewsMatch
匹配没有类型的文件.php
,如Mark Amery 对类似问题的回答:
<Files "*.php">
MultiviewsMatch Any
</Files>
答案4
我正在使用带有虚拟主机的 Xammp,mod_rewrite 的错误已在 httpd-vhosts.conf 中的 <Directory "YourPath"> 中删除
反而
选项索引 FollowSymLinks MultiViews
放
期权指数 FollowSymLinks
问候。