在基于PHP的应用程序的一个部署中,Apache的MultiViews选项用于隐藏请求分派器脚本的.php扩展。例如,请求
/page/about...would由以下人员处理
/page.php...with PATH_INFO中可用的请求URI的尾部部分。
大多数情况下,这样做可以很好地工作,但偶尔也会导致如下错误
[error] [client 86.x.x.x] no acceptable variant: /path/to/document/root/page我的问题是:是什么偶尔会触发这个错误,我如何解决这个问题?
发布于 2014-07-15 21:39:30
Mark Amery给出的答案几乎完成了,但是它缺少最佳位置,并且没有解决“请求中没有给出扩展,因此使用替代方案协商失败”的问题。
您可以通过添加以下配置片段来解决此错误:
你的PHP配置应该是这样的:
<FilesMatch "\.ph(p3?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>请勿使用AddType application/x-httpd-php .php或任何其他AddType
您的附加配置应如下所示:
RemoveType .php
<Files "*.php">
MultiviewsMatch Any
</Files>如果你使用AddType,你会得到这样的错误:
GET /index/123/434 HTTP/1.1
Host: test.net
Accept: image/*
HTTP/1.1 406 Not Acceptable
Date: Tue, 15 Jul 2014 13:08:27 GMT
Server: Apache
Alternates: {"index.php" 1 {type application/x-httpd-php}}
Vary: Accept-Encoding
Content-Length: 427
Connection: close
Content-Type: text/html; charset=iso-8859-1正如您所看到的,它确实找到了index.php,但是它不使用此替代方法,因为它不能将Accept: image/*与application/x-httpd-php匹配。如果你请求/index.php/1/2/3/4,它工作得很好。
我在mod_negotiation模块的源代码中找到了原因。我试图找出为什么如果.php类型是'cgi‘,Apache会工作,而不是其他类型(提示:application/x-httpd-cgi是硬编码的..)。而在源代码中,我注意到只有当文件的Content-Type与Accept头匹配,或者如果文件的Content-Type为空时,apache才会将该文件视为匹配。
如果您使用SetHandler,那么apache将不会看到.php文件为application/x-httpd-php,但不幸的是,许多发行版也在/etc/mime.type文件中定义了这一点。因此,为了确定,只要将RemoveType .php添加到您的配置,如果这个错误是困扰你。
https://stackoverflow.com/questions/16357933
复制相似问题