Apache 2.4:标头未设置不起作用

Apache 2.4:标头未设置不起作用

我们正在运行 apache 2.4 以便为我们的 typo3 生成的网站提供服务。

一般而言,我们希望 X-Frame-Options SAMEORIGIN所有请求都包含 Header。

但有一个例外。对于特定的 URL,应该取消设置此 Header,因为它必须在另一个域的 iFrame 中使用。

所以我添加了这样的内容:

Header always set X-Frame-Options SAMEORIGIN

<Location /anotherURL>
    Header always unset X-Frame-Options
</Location>`

当我尝试请求给定的 URL 时,https://www.example.com/X-Frame-Options在响应中看到 -Header,但https://www.example.com/anotherURL这个 Header 仍然存在。

我已检查 Location 指令是否确实通过Require all denied在 Location 指令中添加 来处理。激活此功能后,对 URL 的访问/anotherURL将被拒绝,正如预期的那样。

如果我将位置从 更改/anotherURL/typo3未设置,则工作将按预期进行。

我看到的这两个 URL 之间的唯一区别是,/typo3在 htdocs 下的目录结构中存在/anotherURL一个由 Typo3 处理的 URL。

我现在的问题是,为什么 Apache 会忽略我的 Header unset 命令?从 Apache 的角度来看,它应该不知道 Typo3 正在做什么,一旦它生成响应标头,Location-Directive 应该匹配(它显然正在这样做)并处理其中的命令。

我浏览了一些与取消设置 HTTP 标头的问题有关的其他问题,但没有任何建议能够解决我的具体问题。

答案1

对此,我有以下见解:

主要问题在于mod_rewrite,为什么我的Header语句没有在Location-Directive中执行。

/anotherURL一旦收到带有虚拟 URL(如 )的请求(该请求不存在任何物理实体),mod_rewrite 就会立即开始应用其规则。在这里,它将/index.php信息映射到 GET 参数,并将其推送到/anotherURLGET 参数中,这些参数稍后将用于识别 Typo3 页面。

这解释了为什么Header语句没有被执行,请求的Location已经改变了。

现在来看看对我有用的解决方案。由于我不能依赖 URL,所以我必须找到其他信息。对我来说,Referer 很适合我:

SetEnvIf Referer ^https:\/\/www.(location1|location2).de\/test\.html$ IFRAME_ENV Header always set X-Frame-Options "sameorigin" env=!IFRAME_ENV

会起作用。

现在,对于每个请求,都会检查 referer。默认情况下,会添加 X-Frame-Otions 标头,除非 referer 设置为两个 URL,我希望从这两个 URL 允许 iFrame 嵌入。

如果有人知道如何在 mod_rewrite 启动之前应用位置指令,我对这样的解决方案非常开放:) 直到这对我有用为止。

感谢大家的支持。

答案2

尝试这个:

<Location /anotherURL>
    Header always unset X-Frame-Options
    Header unset X-Frame-Options
</Location>

遇到过同样的问题,Jboss 后端没有取消设置标头,上面已经修复了这个问题。现在想不起来为什么了(与包含关键字时的处理顺序有关always)。

相关内容