【发布时间】:2016-08-27 17:37:47
【问题描述】:
我有一个网站,其中在/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,那么像 301s 和 404s 这样的错误页面就不会设置标题。另一方面,如果我确实添加了always,那么如果我在.htaccess 中使用默认值(即onsuccess),那么标题可能会设置两次。正如文档所述:“在某些情况下,在两种情况下重复此指令是有意义的,因为就现有标头而言,它始终不是 onsuccess 的超集”。两次设置标头对于 HTTP 响应并不总是有效,请参阅https://stackoverflow.com/a/4371395/641481。所以我想自然而然地避免它。
我现在的问题是:我应该在什么时候使用onsuccess(即默认值)以及什么时候使用always?我必须承认,即使在阅读了 Apache 文档几次之后,我也并不完全理解这一点。务实地说,似乎总是使用always 会导致正确/预期的行为。
我也不明白为什么 Apache 会在 always 和 onsuccess 中设置标头两次。对我来说这似乎是错误的,但这一定有充分的理由,因为我认为 Apache 开发人员比我对 HTTP 了解的多得多;-)
【问题讨论】:
标签: apache .htaccess http http-headers virtualhost