Apache的Header配置中“always”和“onsuccess”有什么区别?

时间:2016-05-02 20:34:12

标签: apache .htaccess http http-headers virtualhost

我有一个网站,其中/etc/apache2/sites-enabled/中定义了虚拟主机,其标头设置为always选项,如下所示:

Header always set X-Frame-Options DENY

如果我现在在网站的根文件夹中使用.htaccess设置相同的标头,但没有always,那么标头会在服务器的响应中返回两次。

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

Header set X-Frame-Options DENY

服务器的回复:

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文档说没有always选项,会使用默认值onsuccess。但他们也说“...... onsuccess的默认值不会限制对2xx状态代码的响应的操作......”http://httpd.apache.org/docs/current/en/mod/mod_headers.html#header)。

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

我现在的问题是:我应该何时使用onsuccess(即默认值)和何时always?我必须承认,即使经过几次阅读Apache文档,我也不完全理解这一点。实际上,似乎始终使用always会导致正确/预期的行为。

如果在alwaysonsuccess中设置了Apache,我也不明白为什么Apache会将标头写入两次。这对我来说似乎不对,但是必须有一个很好的理由,因为我认为Apache-devs比我对HTTP的了解要多得多; - )

2 个答案:

答案 0 :(得分:0)

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

这是Adobe的参考代码:

原始配置:Header always append X-Frame-Options SAMEORIGIN

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

当我询问时,Adobe给出了以下原因。谢谢Adobe。

说明: 使用“合并”而不是“追加”可以防止将条目的值多次添加到标头中。

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

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

还似乎他们没有在merge + expr语法中使用“始终”。也许还可以解决Apache怪异的问题。

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

答案 1 :(得分:-1)

这只是部分答案,因为它不包含onsuccess属性。它基于在Ubuntu 14操作系统上运行的apache 2.4.7的经验。希望它可以帮助你。

set指令的纯Header参数,没有属性,通过强制always的参数成为唯一传递的参数来覆盖任何Header set属性。如果相同的指令出现在目录中,即基于文件系统的.htaccess文件,则它优先于与该目录相关的虚拟主机定义文件中指出的相同指令。如果另外注意属性always,则它会将相同指令的任何,相同或不同的符号添加到服务器答案而不是覆盖/替换它。

可能onsuccess属性,我很遗憾没有时间进行探索,可能会像always属性一样处理。