如何将Drupal内容嵌入其他网站(删除X-Frame-Options:SAMEORIGIN)?


11

我试图制作一个带有drupal页面的iframe,但收到以下消息:

多个“拒绝在一个框架中显示(页面地址),因为它将'X-Frame-Options'设置为'SAMEORIGIN'。”

然后,我尝试使用更改页面控制器中响应的标题

$response->headers->set('X-Frame-Options', 'GOFORIT');

我收到以下消息

加载“(页面地址)”时遇到多个具有冲突值的“ X-Frame-Options”标头(“ GOFORIT,SAMEORIGIN”)。退回到“ DENY”。

Drupal核心在所有响应中放入以下代码。

$response->headers->set('X-Frame-Options', 'SAMEORIGIN', FALSE);

因此,如何仅针对此响应覆盖X-Frame-Options标头以将此页面嵌入其他网站?

我正在使用Drupal 8.0.0。

Answers:


4

X-Frame-Options头似乎为了防止点击劫持已经加入到Drupal的8:https://www.drupal.org/node/2514152

根据上述通知,为了将您的Drupal网站嵌入其他网站,

需要添加一个具有更高优先级的新Response Subscriber作为当前FinishResponseSubscriber(请参阅core.services.yml)以覆盖或删除标头-根据使用情况

它还提供了一个代码示例:

<?php
    $path = $request->getPathInfo();

    if (strpos($path, '/fb-app/') === 0) {
      $request->headers->remove('X-Frame-Options');
    }
?>

22

Drupal 8将响应标头添加X-Frame-Options: SAMEORIGIN到所有页面。这样可以防止内容包含在第三方网站的iframe中。

例如,您可以在Google图片搜索中检查您的内容是否未出现在预览框中。

此功能是在drupal 8 beta 13中引入的。

变更记录

现在,默认情况下,Core已受到保护,免遭点击劫持(X-Frame-Options:SAMEORIGIN)

是不正确的,因为优先级必须更高,实际上必须更低。该代码示例更改了请求,但必须更改响应。

为了解决这个问题,这里是完整的代码,包括将其放入服务容器的yaml文件:

mymodule/src/EventSubscriber/RemoveXFrameOptionsSubscriber.php

<?php

namespace Drupal\mymodule\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class RemoveXFrameOptionsSubscriber implements EventSubscriberInterface {

  public function RemoveXFrameOptions(FilterResponseEvent $event) {
    $response = $event->getResponse();
    $response->headers->remove('X-Frame-Options');
  }

  public static function getSubscribedEvents() {
    $events[KernelEvents::RESPONSE][] = array('RemoveXFrameOptions', -10);
    return $events;
  }
}

mymodule/mymodule.services.yml

services:
  remove_x_frame_options_subscriber:
    class: Drupal\mymodule\EventSubscriber\RemoveXFrameOptionsSubscriber
    tags:
      - { name: event_subscriber }

我正在使用自定义字段格式化程序来包含Youtube iframe。如何删除这些X-Frame-Options以显示YouTube iframe Player?
JayKandari'8

现在应该接受此答案-经过深思熟虑且完整。也感谢您提供的插入代码,非常有帮助。
Storsey

6

4k4给出了很好的解决方案,但也可能是

$ response-> headers-> set('X-Frame-Options','ALLOW-FROM https://ALLOWED.SITE/ ');

比...好点

$ response-> headers-> remove('X-Frame-Options');


1
请注意,allow-from uri它已被弃用,将不再在现代浏览器上运行。此标头目前仅有的2个选项是sameorigindenyX-Frame-Options MDN
Beebee

2

.htaccess使用单个语句覆盖标头非常简单

Header set X-FRAME-OPTIONS "ALLOWALL"

或者,您可以使用if语句apache表达式使它仅适用于特定条件

<If "%{QUERY_STRING} =~ /embed/">
    Header set X-FRAME-OPTIONS "ALLOWALL"
</If>

然后您可以调用embed查询字符串添加您的URL

https://domain.com/yoururl?param1=true&embed

为此,您将需要apache 2.4或更高版本并启用标头模块。如果未启用,则可以通过以下方式启用它们

sudo a2enmod headers
sudo service apache2 restart

1

现在有一个可下载的Drupal 8模块:X-Frame-Options配置

此模块可用于通过适当的指令在您的网站上设置x-frame-options标头。当您要在另一个站点的iframe中包含站点的页面之一时,这可能会很有用。

指令必须是:

  1. 拒绝
  2. SAMEORIGIN
  3. ALLOW-FROM uri(Chrome和Safari目前不接受[2018-10-25])。您将被允许配置哪个uri。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.