“与”的区别是什么;“始终”;及;“成功”;在Apache中';s头配置?

“与”的区别是什么;“始终”;及;“成功”;在Apache中';s头配置?,apache,.htaccess,http,http-headers,virtualhost,Apache,.htaccess,Http,Http Headers,Virtualhost,我有一个网站,其中虚拟主机是在/etc/apache2/sites enabled/中定义的,标题设置为始终选项,如下所示: Header always set X-Frame-Options DENY 如果我现在在网站的根文件夹中使用.htaccess设置相同的头,但不使用always,则在服务器的响应中返回两次头 .htaccess中的设置(以及其他设置): 服务器的响应: HTTP/1.1 200 OK Date: Mon, 02 May 2016 16:02:29 GMT Server

我有一个网站,其中虚拟主机是在
/etc/apache2/sites enabled/
中定义的,标题设置为
始终
选项,如下所示:

Header always set X-Frame-Options DENY
如果我现在在网站的根文件夹中使用
.htaccess
设置相同的头,但不使用
always
,则在服务器的响应中返回两次头

.htaccess
中的设置(以及其他设置):

服务器的响应:

HTTP/1.1 200 OK
Date: Mon, 02 May 2016 16:02:29 GMT
Server: Apache/2.4.10 (Debian)
X-Frame-Options: DENY
Cache-Control: no-cache, no-store, must-revalidate, private
Pragma: no-cache
X-XSS-Protection: 1
X-Content-Type-Options: nosniff
Last-Modified: Mon, 02 May 2016 15:03:42 GMT
Accept-Ranges: bytes
Content-Length: 0
X-Frame-Options: DENY
X-XSS-Protection: 1
X-Content-Type-Options: nosniff
Cache-Control: no-cache, no-store, must-revalidate, private
Pragma: no-cache
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
Apache文档说,如果没有
始终
选项,则使用默认值
onsuccess
。但是他们也说“…onsuccess的默认值不限制一个操作,只限于带有2xx状态码的响应…”()

但是如果我不总是添加
,那么像301s和404s这样的错误页面就不会设置标题。另一方面,如果我添加
始终
,那么如果我使用
.htaccess
中的默认值(即
onsuccess
),则可能会设置两次标题。正如文档中所述:“在某些情况下,使用这两个条件重复此指令是有意义的,因为相对于现有的头,始终不是onsuccess的超集”。设置两次头并不总是对HTTP响应有效,请参阅。所以我自然想避免它

我现在的问题是:我应该在什么时候使用
onsuccess
(即默认值)以及何时始终使用
?我必须承认,即使在阅读了几遍Apache文档之后,我也不能完全理解这一点。实际上,似乎总是使用
总是
会导致正确/预期的行为


我也不明白,如果在
always
onsuccess
中设置了头,为什么Apache会写两次头。对我来说这似乎是错误的,但肯定有一个很好的理由,因为我假设Apache开发人员比我更了解HTTP;-)

这只是部分答案,因为它不包括
onsuccess
属性。它基于在Ubuntu14操作系统上运行Apache2.4.7的经验。希望它能帮助你

Header
指令的纯
set
参数(不带属性)通过强制将参数设置为
Header set
作为唯一传递的参数来覆盖任何
始终
属性。如果同一指令出现在目录中,即基于文件系统的.htaccess文件,则该指令优先于与该目录相关的虚拟主机定义文件中注明的同一指令。如果属性
始终
被附加注释,则会将相同指令的任何相等或不同符号添加到服务器应答中,而不是覆盖/替换它


很可能,
onsuccess
属性(很遗憾,我现在没有时间来探讨)的处理方式可能与
始终
属性类似。

我们使用Adobe Experience Manager和Apache Web服务器的Dispatcher[caching]模块。Adobe最近更改了下面的代码。基本上,我认为您可能需要使用“expr=”语法来确保尚未设置该值。这应该可以消除重复

以下是Adobe的参考代码:

原始配置:
标题始终附加X-Frame-Options SAMEORIGIN

新配置:
Header merge X-Frame-Options SAMEORIGIN“expr=%{resp:X-Frame-Options}!='SAMEORIGIN'

当我询问时,Adobe给了我以下理由。谢谢Adobe

说明: 使用“merge”而不是“append”可以防止条目的值被多次添加到标题中

expr=expression:当且仅当表达式的计算结果为true时才应用该指令。表达式语法和计算的详细信息记录在ap_expr文档中。“expr”正在查看服务器(Publisher应用服务器)的响应头,以确保它不包含SAMEORIGIN。这可确保SAMEORGIN不会在发送回请求客户端的响应头中重复

这是必需的,因为测试发现,当AEM包含此标头时,即使使用merge选项,Apache也会复制SameOrgin值。当Apache从自身获取头时,它能够进行适当的合并,但是因为第一个头是由AEM在Apache实例之外设置的,所以当它变得怪异时(并且需要额外的表达式)

此外,它们似乎没有将“始终”与merge+expr语法一起使用。也许是为了解决Apache的古怪问题


PS。。。请记住在您的情况下将“SAMEORIGIN”改为“DENY”。

经过广泛的测试后,不,一个
集合总是
不会覆盖一个
集合
@user5994461:您似乎误解了我的话:第一段的第一句说“Header'set'覆盖'always'”,但它没有说“always'overrides'set'”。你的测试证明了我的观点。请还原否决权。不正确。集合不总是覆盖,也不总是覆盖集合。它们独立工作,如果两者都使用,http响应将获得2个标头。@user5994461:Jun 23“不重写”,Jun 26“不总是重写”?你是否仔细阅读了上下文中的问答?你没有给出细节,只是假设。我们应该在这里搜索并提供帮助一个事实基础。我用不同的设置组合进行了测试。我将解释与更多细节联系起来,但它已经被堆栈溢出删除。很抱歉,对于非琐碎的问题和答案,堆栈溢出很糟糕。
HTTP/1.1 200 OK
Date: Mon, 02 May 2016 16:02:29 GMT
Server: Apache/2.4.10 (Debian)
X-Frame-Options: DENY
Cache-Control: no-cache, no-store, must-revalidate, private
Pragma: no-cache
X-XSS-Protection: 1
X-Content-Type-Options: nosniff
Last-Modified: Mon, 02 May 2016 15:03:42 GMT
Accept-Ranges: bytes
Content-Length: 0
X-Frame-Options: DENY
X-XSS-Protection: 1
X-Content-Type-Options: nosniff
Cache-Control: no-cache, no-store, must-revalidate, private
Pragma: no-cache
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html