Apache:"Header always set"和"Header set"之间的区别?

cal*_*531 27 apache .htaccess http-headers

问题

  1. Header always setHeader setApache有什么区别?
  2. 也就是说,always关键字在设置标题的情况下会发生什么变化?
  3. 我应该总是使用标题设置always吗?
  4. 有什么理由不去吗?

背景

我见过...

Header always set X-Frame-Options DENY
Run Code Online (Sandbox Code Playgroud)

...以及...

Header always set Access-Control-Allow-Headers "*"
Run Code Online (Sandbox Code Playgroud)

...我有时会听到always关键字的存在确保标题设置正确,或者always通常包含关键字更好.但是,我从来没有找到一个明确的,明确的答案,为什么会这样.

我已经检查了Apache文档mod_headers,只是简单地提到always:

当您的操作是现有标头的函数时,您可能需要指定始终的条件,具体取决于设置原始标头的内部表.始终对应的表用于本地生成的错误响应以及成功响应.另请注意,在某些情况下重复使用这两个条件的指令是有意义的,因为对于现有标头,始终不是onsuccess的超集:

  • 您正在为本地生成的非成功(非2xx)响应添加标头,例如重定向,在这种情况下,在最终响应中仅使用始终对应的表.
  • 您正在修改或删除由CGI脚本生成的标头,在这种情况下,CGI脚本在对应于始终而不是默认表的表中.
  • 您正在修改或删除某些服务器生成的标头,但默认的onsuccess条件未找到该标头.

据我所知,这意味着Header set always确保即使在非200页面上也设置了标题.但是,我设置的HTTP标头Header set似乎总是适用于我的404页面等.我在这里误解了什么吗?

FWIW,我发现了SO帖子,比如Apache的Header配置中"always"和"onsuccess"之间有什么区别?,但唯一的答案并没有真正为我解释清楚.

非常感谢,
Caleb

cov*_*ner 24

Apache总是设置Header和Header设置有什么区别?

正如手册中引用的一点所说,没有'总是',你的补充只会在成功的反应中出现.

但这也包括通过mod_proxy和其他类似处理程序"成功"转发错误,这些处理程序大致像代理一样.是什么产生了您发现不同意手册的404?本地文件上的404肯定与引用位描述的行为相同.

也就是说,always关键字在设置标题的情况下会发生什么变化?

Apache的API保留了与每个请求,标头和err_headers相关联的两个列表.如果服务器遇到处理后者请​​求的错误,则不使用前者.

我应该总是使用始终设置标题吗?

这取决于它们的意义.假设您设置的Cache-Control标头与您预期为某些资源提供的服务相关.现在让我们假设您实际上正在提供类似400或502的东西.您可能不希望缓存!

有什么理由不去吗?

往上看.

- / -

手册中还有一点没有引用,它解释了错误代码的代理或CGI,但没有解释Apache正在为以下内容生成错误响应:

可选的条件参数确定此指令将针对哪个响应头的内部表.尽管名称如此,但onsuccess的默认值不会将操作限制为具有2xx状态代码的响应.

在此条件下设置头仍在使用时,例如,一个请求被成功代理或CGI产生,即使它们已经产生一个失败的状态码.