Как встроить контент drupal в другие сайты (удалить X-Frame-Options: SAMEORIGIN)?


11

Я попытался создать iframe со страницей drupal, но получил следующее сообщение:

Несколько "Отказано в отображении (адрес страницы) во фрейме, потому что для параметра" 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.

Ответы:


4

X-Frame-OptionsЗаголовок , кажется, был добавлен в Drupal 8 , с тем чтобы предотвратить кликджекинга: https://www.drupal.org/node/2514152

Согласно приведенному выше уведомлению, для встраивания вашего сайта в Drupal в другие сайты,

необходимо добавить нового подписчика ответа, который имеет более высокий приоритет, чем текущий 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ко всем страницам. Это предотвращает включение контента в iframes на сторонних сайтах.

Вы можете проверить это, например, в поиске картинок Google, что ваш контент не отображается в рамке предварительного просмотра.

Эта функция была введена в Drupal 8 бета 13.

Запись об изменениях

По умолчанию ядро ​​теперь защищено от защелкивания (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. Как мне удалить эти X-Frame-Options для отображения YouTube iframe Player?
JayKandari

Этот ответ должен быть принят сейчас - он хорошо продуман и завершен. Также спасибо за вставленный код, очень полезно.
Сторси

6

4k4 дают отличное решение, но также могут быть

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

лучше чем

$ Response-> headers-> удалить ( 'X-Frame-Options');


1
Обратите внимание, что allow-from uriэто устарело и больше не будет работать в современных браузерах. В данный момент этот заголовок имеет только 2 варианта: sameoriginили deny. X-Frame-Options MDN
Биби

2

Очень просто переопределить заголовки .htaccessс помощью одного оператора

Header set X-FRAME-OPTIONS "ALLOWALL"

В качестве альтернативы вы можете применить его только при определенных условиях, используя выражения apache if if

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

и тогда вы можете вызвать добавление URL embedв строку запроса

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 (в настоящее время [2018-10-25] не поддерживается ни Chrome, ни Safari). Вам будет разрешено настроить, какой URI.

0

Для более новых браузеров ALLOW-FROM uri-settings больше не будут работать, см. «Allow-from uri (устарел)» - раздел в https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame- Опции

Вам нужно добавить

$response->headers->set('Content-Security-Policy', 'frame-ancestors https://ALLOWED.SITE/'); кроме того, что предложил wakh.ru:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.