X-Frame-Options on Apache

43

我想允许特定的域通过 iframe 访问我的网站。

Header set X-Frame-Options ALLOW-FROM https://www.example.com

我知道这可以通过在Apache服务器的配置文件中添加上述行来完成。

这里有两个问题。

  1. 应该添加到哪个配置文件?如果Unix和Windows上运行的Apache不是同一文件,则应该如何操作?

  2. 启用all-from选项后,我仍希望能够从自己的域中运行某些iframe。我是否只需在allow-from后添加以下行?

    Header set X-Frame-Options SAMEORIGIN

或者我应该将自己的域名添加到all-from中,即

 Header set X-Frame-Options ALLOW-FROM https://www.example.com, http://www.my-own-domain.example

我也有类似的情况。出于安全原因(PCI要求),我在DocumentRoot内的.htaccess中添加了“Header append X-FRAME-OPTIONS“SAMEORIGIN””。然而,我尝试添加以下内容以允许页面嵌入推文。不幸的是,运气不太好。我尝试在blog/子目录下的.htaccess中添加以下内容。 Header always append X-FRAME-OPTIONS ALLOW-FROM http://ht.ly/ - mishka
6个回答

45
  1. 您可以将代码添加到.htaccess, httpd.confVirtualHost部分。
  2. Header set X-Frame-Options SAMEORIGIN这是最佳选项。

Allow from URI并非所有浏览器都支持。参考资料:MDN上的X-Frame-Options


@Raptor,也许在旧版本中是这样的,因为现在Chrome确实支持ALLOW-FROM。我正在浏览一个使用iframes的内部网站,其站点将X-Frame-Options设置为此选项,我可以毫无问题地查看它们。 - Havok
3
在Ubuntu 18.04上使用Apache时,我需要编辑/etc/apache2/conf-enabled/ssl-params.conf文件,并将 'Header always set X-Frame-Options DENY' 替换为 'Header always append X-Frame-Options SAMEORIGIN',然后重新启动Apache服务。 - pgee70
我浪费了很多时间期望在VirtualHost部分中它能够工作,但是它根本不行(Apache/2.4.6 CentOS)。如果你遇到这个问题,也许可以尝试将其放在httpd.conf的主体中。 - iforce2d

32

2
这只有在您想要完全禁用X-Frame-Options时才有用 - 在某些情况下,这并不总是正确的解决方案。允许Optimizely正常运行需要管理X-Frame-Options,这也意味着需要不断更新它。所有网站都应该使用X-Frame-Options来增加其访问者的网站安全性。 - Daniel Kenney
非常感谢!这解决了我的问题,我的标头值被设置为DENY,SAMEORIGIN,并且回退到DENY时,在VirtualHosts、Apache配置和htaccess中进行更新都没有起作用。 - Shubh Sheth

3

首先,您需要在服务器上启用mod_headers模块。

运行以下命令:
sudo a2enmod headers
sudo service apache2 restart


3
对我起作用的是以下内容,我在HTTP <VirtualHost *:80> 和 HTTPS <VirtualHost *:443> 的虚拟主机块中添加了以下指令:
ServerName example.com
ServerAlias www.example.com

Header always unset X-Frame-Options
Header set X-Frame-Options "SAMEORIGIN"

这是为什么呢?默认情况下,如果已设置,则服务器不会重置 X-Frame-Options 标头,因此我们需要始终先删除默认值(在我的情况下是 DENY),然后使用下一个规则将其设置为所需的值,在我的情况下是 SAMEORIGIN。当然,您也可以使用 Header set X-Frame-Options ALLOW-FROM ... 规则。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options#configuring_apache - arieltools

1

我发现如果httpd服务器内的应用程序有一条规则,如“如果X-Frame-Options标头存在且具有值,请不要更改它;否则添加标题X-Frame-Options: SAMEORIGIN”,那么像“Header always unset X-Frame-Options”的httpd.conf mod_headers规则就不够用了。SAMEORIGIN值将始终到达客户端。

为了解决这个问题,在最外层的httpd.conf文件中我添加了两个而不是一个mod_headers规则:

Header set X-Frame-Options ALLOW-FROM http://example.com early
Header unset X-Frame-Options

第一条规则告诉任何内部请求处理程序,其他代理已经负责防止点击劫持,它可以跳过尝试拯救世界的步骤。它以“早期”处理方式运行。第二条规则去除完全不需要的X-Frame-Options头。它以“晚期”处理方式运行。
我还添加了适当的内容安全策略标头,以使世界保持受保护状态,但仍然可以运行来自受信任站点的多源JavaScript。

1

这个方法对所有浏览器都有效:

  1. 创建一个包含所有JavaScript的页面。
  2. 在同一服务器上创建第二个页面,并使用object标签嵌入第一个页面。
  3. 在第三方网站上使用Object标签嵌入第二个页面。
  4. 在原始服务器的public_html文件夹中创建.htaccess文件,并将Header unset X-Frame-Options放入其中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接