我有一个网站,其中/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
会导致正确/预期的行为。
如果在always
和onsuccess
中设置了Apache,我也不明白为什么Apache会将标头写入两次。这对我来说似乎不对,但是必须有一个很好的理由,因为我认为Apache-devs比我对HTTP的了解要多得多; - )
答案 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
属性一样处理。