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

时间:2016-09-15 04:08:32

标签: apache .htaccess http-headers

问题

  1. Apache中Header always setHeader set之间的区别是什么?
  2. 也就是说,always关键字在设置标头的情况下会发生什么变化?
  3. 我应该始终使用always设置标题吗?
  4. 有没有理由不这样做?
  5. 背景

    我见过......

    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?之类的帖子,但唯一的答案并没有真正为我解释清楚。

    非常感谢,
    迦勒

1 个答案:

答案 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成功代理或生成,即使它们也是如此   生成了失败的状态代码。