Header always set
和Header set
之间的区别是什么?always
关键字在设置标头的情况下会发生什么变化?always
设置标题吗?我见过......
Header always set X-Frame-Options DENY
......以及......
Header always set Access-Control-Allow-Headers "*"
...我有时会听到always
关键字的存在可确保标头设置正确,或者通常最好包含always
关键字。但是,我从未找到为什么的明确,明确的答案。
我已经检查了Apache docs for mod_headers
,其中只提到了always
:
当您的操作是现有标头的函数时,您可能需要指定始终的条件,具体取决于设置原始标头的内部表。始终对应的表用于本地生成的错误响应以及成功的回应。另请注意,在某些情况下重复使用这两个条件的指令是有意义的,因为对于现有标题,始终不是onsuccess的超集:
- 您正在为本地生成的非成功(非2xx)响应添加标头,例如重定向,在这种情况下,只会在最终响应中使用与always相对应的表。
- 您正在修改或删除由CGI脚本生成的标头,在这种情况下,CGI脚本位于表中,始终对应于默认表,而不是默认表。
- 您正在修改或删除某些服务器生成的标头,但默认的onsuccess条件未找到该标头。
据我所知,这意味着Header set always
确保即使在非200页面上也设置了标头。但是,我使用Header set
设置的HTTP标头似乎总是适用于我的404页面等等。我在这里误解了什么吗?
FWIW,我发现了What is the difference between "always" and "onsuccess" in Apache's Header config?之类的帖子,但唯一的答案并没有真正为我解释清楚。
非常感谢,
迦勒
答案 0 :(得分:22)
总是设置Header和Apache中设置的Header之间的区别是什么?
正如手册中引用的一点所说,如果没有“总是”,你的补充只会在成功的反应中出现。
但是这也包括通过mod_proxy和其他类似处理程序“成功”转发错误,这些处理程序大致像代理一样。是什么产生了您发现不同意手册的404?本地文件上的404肯定与引用位描述的行为相同。
也就是说,always关键字在设置标题的情况下有什么变化?
Apache的API保留了与每个请求,标头和err_headers相关联的两个列表。如果服务器遇到处理后者请求的错误,则不使用前者。
我应该始终使用始终设置标题吗?
这取决于它们的意义。假设您设置的Cache-Control标头与您预期为某些资源提供的服务相关。现在让我们假设您实际上正在提供类似400或502的东西。您可能不希望缓存!
有没有理由不这样做?
见上文。
- / -
在手册中还有一点没有引用,它解释了错误代码的代理或CGI,但没有解释Apache正在生成错误响应的那个:
可选的条件参数确定哪个内部表 响应标头此指令将针对此操作。尽管 name,onsuccess的默认值不限制操作 具有2xx状态代码的响应。
在这种情况下设置的标题仍然用于例如a 请求由CGI成功代理或生成,即使它们也是如此 生成了失败的状态代码。