- 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/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!