我们正在运行 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 参数,并将其推送到/anotherURL
GET 参数中,这些参数稍后将用于识别 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
)。