我在使用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
并在相关虚拟主机的选项中包含MultiView:
<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 /内容url regulary访问它。 所以这个问题只针对php文件。 什么可以使谈判失败的任何线索?
我find了解决scheme。 确实很简单。 我忘了包括以下内容:
AddType application/x-httpd-php .php
进入Apache的mod_mime部分到httpd.conf中
我被PHP脚本正确工作的事实误导了; 然而谈判失败,因为mod_negotiation只查找“有趣”(和已知)的文件types。
从Debian Squeeze更新到Wheezy后,我遇到了同样的问题。 mods-enabled/mime.conf
包含系统中已知的文件types:
TypesConfig /etc/mime.types
问题是/etc/mime.types
文件被更新所取代,在被replace的文件中,PHP部分被注释掉了。 search时发现:
#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
文件。