- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在基于PHP的应用程序的一种部署中,Apache的MultiViews
选项用于隐藏请求调度程序脚本的.php扩展名。例如。要求
/page/about
/page.php
[error] [client 86.x.x.x] no acceptable variant: /path/to/document/root/page
最佳答案
简短答案
同时满足以下所有条件时,可能会发生此错误:
AddType
伪指令为任意文件分配任意类型来允许Multiviews提供PHP文件,最有可能的是这样的一行:AddType application/x-httpd-php .php
Accept
作为可接受的MIME类型的 */*
header (这是非常不寻常的,这就是为什么您很少看到该错误的原因)。 MultiviewsMatch
指令设置为其默认值NegotiatedOnly
。 <Files "*.php">
MultiviewsMatch Any
</Files>
mod_negotiation
和HTTP的
Accept
和
Accept-Foo
header 的工作至少有一个简要的概述。在遇到OP描述的错误之前,我对这两个都不了解。我不是通过故意选择启用
mod_negotiation
的,而是因为
apt-get
就是为我设置Apache的方式,并且我启用
MultiViews
时对它的含义没有太多的了解,除了可以让
.php
留在URL末尾之外。您的情况可能相似或相同。
Accept
和
Accept-Language
之类的
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
mod_negotiation
允许您将多个文件(例如myresource.html.en
,myresource.html.fr
,myresource.pdf.en
和myresource.pdf.fr
)存储在同一文件夹中,然后自动使用请求的Accept-*
header 来确定客户端向myresource
发送请求时要提供的服务。有两种方法可以做到这一点。第一种是在同一文件夹中创建Type Map文件,该文件显式声明每个可用文档的MIME类型和语言。另一个是多 View 。 Multiviews
... If the server receives a request for
/some/dir/foo
and/some/dir/foo
does not exist, then the server reads the directory looking for all files namedfoo.*
, and effectively fakes up a type map which names all those files, assigning them the same media types and content-encodings it would have if the client had asked for one of them by name. It then chooses the best match to the client's requirements, and returns that document.
Accept
header 。与类型映射方法的唯一区别是Apache从文件扩展名推断文件的MIME类型,而不是通过您在类型映射中显式声明它。
Accept
header 。 (例如,如果在可接受的语言中没有任何变体,可能会发生同样的事情。)这符合HTTP规范,该规范指出:
If an Accept header field is present, and if the server cannot send a response which is acceptable according to the combined Accept field value, then the server SHOULD send a 406 (not acceptable) response.
test.html
的文件,该文件包含字符串“Hello World”,然后尝试使用允许HTML响应而不允许HTML响应的Accept header 来请求它。我在这里用
curl
在我的本地(Ubuntu)计算机上对此进行了演示:
$ curl --header "Accept: text/html" localhost/test
Hello World
$ curl --header "Accept: image/png" localhost/test
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>406 Not Acceptable</title>
</head><body>
<h1>Not Acceptable</h1>
<p>An appropriate representation of the requested resource /test could not be found on this server.</p>
Available variants:
<ul>
<li><a href="test.html">test.html</a> , type text/html</li>
</ul>
<hr>
<address>Apache/2.4.6 (Ubuntu) Server at localhost Port 80</address>
</body></html>
mod_negotiate
在确定它是否可以提供服务时如何确定PHP文件的MIME类型?由于该文件将要执行,并且可能会吐出它喜欢的任何
Content-Type
header ,因此在执行之前不知道类型。
.php
文件。但是您很有可能会遵循互联网上众多帖子中的一个的建议(如果我使用Google
'php apache multiviews',则我在首页上会显示4个帖子,而
top one显然是此问题的OP所遵循的,因为他实际上在评论它)主张使用AddType header 解决此问题,可能看起来像这样:
AddType application/x-httpd-php .php
.php
文件?当然,浏览器是否不将
application/x-httpd-php
作为它们将在其
Accept
header 中接受的类型之一?
*/*
(因此允许任何MIME类型的响应-他们仅使用
Accept
header 来表达偏好权重,而不是限制它们接受的类型。)这导致
mod_negotiation
愿意选择并提供MIMEt类型的
.php
文件-完全可以! -与他们相关联。
Accept
header 就是...
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
*/*
作为可接受的内容类型,因此允许服务器提供其喜欢的任何内容类型的文件。但是,一些不太流行的浏览器不接受
*/*
-或仅将其包含在页面请求中,而不是在加载可能也通过PHP服务的
<script>
或
<img>
标记的内容时-这就是我们的问题所在。
src
元素的
<img>
指向动态提供图像的PHP脚本(URL中省略了
.php
扩展名)时,我首先见证了它对于BlackBerry用户的失败:
Mozilla/5.0 (BlackBerry; U; BlackBerry 9320; fr) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.714 Mobile Safari/534.11+
mod_negotiate
通过某种方式为PHP脚本提供服务,而不是为它们提供任意类型,然后依靠浏览器发送
Accept: */*
header 。为此,我们使用
MultiviewsMatch
指令指定多 View 可以为PHP文件提供服务,无论它们是否与请求的
Accept
header 匹配。默认选项是
NegotiatedOnly
:
The
NegotiatedOnly
option provides that every extension following the base name must correlate to a recognizedmod_mime
extension for content negotiation, e.g. Charset, Content-Type, Language, or Encoding. This is the strictest implementation with the fewest unexpected side effects, and is the default behavior.
Any
选项得到我们想要的:
You may finally allow
Any
extensions to match, even ifmod_mime
doesn't recognize the extension.
.php
文件,我们使用
<Files>
指令,如下所示:
<Files "*.php">
MultiviewsMatch Any
</Files>
关于php - Apache中MultiViews中的“no acceptable variant”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16357933/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!