Apache 文件协商失败

lor*_*con 27 php apache-2.2

我在使用 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)
Run Code Online (Sandbox Code Playgroud)

请注意,我mod_negotiation在相关虚拟主机的选项中启用了 MultiViews:

<Directory "/home/server1/htdocs">
    Options Indexes Includes FollowSymLinks MultiViews
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>
Run Code Online (Sandbox Code Playgroud)

我也使用mod_rewrite, 遵循以下.htaccess规则:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^\./]*)$ index.php?t=$1 [L]
</IfModule>
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪,但是在与 PHP 5.3.6 相同的盒子上它曾经可以正常工作。我只是想升级到 PHP 5.4.0,但我无法解决这个协商问题。关于为什么 Apachecontents.php在请求时无法匹配的任何想法content(这应该是 mod_negotiation 应该做什么)?

更新:我注意到 mod_negotiation 对于扩展名不同于 .php 的文件的行为是正确的:所以如果我有一个名为 /admin/contents.txt 的文件,我可以使用带有 /admin/contents url 的浏览器定期访问它。所以这个问题只针对 php 文件。关于什么可能导致谈判失败的任何线索?

lor*_*con 45

我找到了解决方案。确实很容易。我忘了包括以下内容:

AddType application/x-httpd-php .php
Run Code Online (Sandbox Code Playgroud)

进入 apache mod_mime 部分进入 httpd.conf

我被 php 脚本正常工作这一事实误导了;然而协商失败了,因为 mod_negotiation 只寻找“有趣的”(和已知的)文件类型。

  • 这个!就在这里!花了大部分时间寻找为什么我会收到非常无用的“发现文件/未协商”错误。脚本之前一直运行良好,我花了很长时间来跟踪我正在测试的发行版上的 mod_mime 中没有包含该类型的事实。我欠你一瓶啤酒先生。 (3认同)

小智 12

从 Debian Squeeze 更新到 Wheezy 后,我遇到了同样的问题。在mods-enabled/mime.conf包括从系统中已知的文件类型:

TypesConfig /etc/mime.types
Run Code Online (Sandbox Code Playgroud)

问题是该/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
Run Code Online (Sandbox Code Playgroud)

我必须#从包含 php 相关内容的每一行中删除,然后保存并重新启动 Apache Web 服务器。这解决了问题而无需修改mime.conf文件。

  • 请注意,这样做可能会使“libapache-mod-php5”执行名称中带有“.php”的文件(如“filename.php.jpeg”),这是注释掉它们的最初理由。请参阅 https://bugs.debian.org/589384 (2认同)

Kev*_*oid 6

您可以配置为匹配没有类型的文件,而不是映射.php到媒体类型(这可能会产生安全隐患,如禁用它们的Debian Bug 589384中所述),如Mark Amery 对类似问题的回答中所建议的:MultiviewsMatch.php

<Files "*.php">
    MultiviewsMatch Any
</Files>
Run Code Online (Sandbox Code Playgroud)