首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Apache中来自MultiViews的“没有可接受的变体”

在Apache中来自MultiViews的“没有可接受的变体”
EN

Stack Overflow用户
提问于 2013-05-03 19:31:23
回答 1查看 8.1K关注 0票数 10

在基于PHP的应用程序的一个部署中,Apache的MultiViews选项用于隐藏请求分派器脚本的.php扩展。例如,请求

代码语言:javascript
复制
/page/about

...would由以下人员处理

代码语言:javascript
复制
/page.php

...with PATH_INFO中可用的请求URI的尾部部分。

大多数情况下,这样做可以很好地工作,但偶尔也会导致如下错误

代码语言:javascript
复制
[error] [client 86.x.x.x] no acceptable variant: /path/to/document/root/page

我的问题是:是什么偶尔会触发这个错误,我如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2014-07-15 21:39:30

Mark Amery给出的答案几乎完成了,但是它缺少最佳位置,并且没有解决“请求中没有给出扩展,因此使用替代方案协商失败”的问题。

您可以通过添加以下配置片段来解决此错误:

你的PHP配置应该是这样的:

代码语言:javascript
复制
<FilesMatch "\.ph(p3?|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

请勿使用AddType application/x-httpd-php .php或任何其他AddType

您的附加配置应如下所示:

代码语言:javascript
复制
RemoveType .php
<Files "*.php">
    MultiviewsMatch Any
</Files>

如果你使用AddType,你会得到这样的错误:

代码语言:javascript
复制
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添加到您的配置,如果这个错误是困扰你。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16357933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档