众所周知,将其他网站页面嵌入到自己网站的方式为:iframe.
有时候我们希望禁止他人内嵌我们的网站内容,其方式如下:
设置X-Frame-Options 响应头,它有三个值
DENY,表示该页面任何情况不允许在 frame 中展示.
SAMEORIGIN,表示该页面可以在相同域名页面的 frame 中展示。
ALLOW-FROM uri,表示该页面可以在指定来源的 frame 中展示。
不同服务器配置方法:
配置 Apache 在所有页面上发送 X-Frame-Options 响应头, ‘site’ 配置中添加此行 Header always append X-Frame-Options SAMEORIGIN
配置 nginx 发送 X-Frame-Options 响应头, ‘http’, ‘server’ 或者 ‘location’ 的配置中添加:add_header X-Frame-Options SAMEORIGIN
配置 IIS 发送 X-Frame-Options 响应头,Web.config 文件中添加
回到我们的Drupal站点,
Drupal8 中默认的设置了其值为 SAMEORIGIN 用于保护站点信息,
FinishResponsesubscriber :: onRespond 中,你可以找到这样一句,
$response->headers->set(‘X-Frame-Options’, ‘SAMEORIGIN’, FALSE).
所以Drupal8的站点中默认是禁止跨域嵌入的。
但是有时候我们又需要为特定的站点,比如合作伙伴开设iframe嵌入,又如何取消限制呢
核心在于此,我们可以去除X-Frame-Options的响应头,
$response->header->remove(‘X-Frame-Options’),
但是这样也不好,因为任何人都解除禁止了.所以推荐这样,
$response->headers->set(‘X-Frame-Options’, ‘ALLOW-FROM “allowsiteuri”‘)
解释:FinishResponsesubscriber 为响应订阅者处理完成的响应服务
我们通过新模块的方式具体做一下(请注意这里包含了模块的创建和服务的注册过程
一,创建aaron_iframed.info.yml 文件注册模块信息
二,创建aaron_iframed.services.yml 文件注册一个服务
三,创建ChangeXFrameOptionsSubscriber.php文件实现
以上,便实现了一个包含小服务的一个小模块,并完成了X-Frame-Options改变.
转载请注明:XAMPP中文组官网 » Drupal8 响应订阅器之–iframe限制解除