ckeditor не запускается из субдомена

Аватар пользователя Shardach Shardach 12 января в 9:30

Добрый день, может кто сталкивался с подобной проблемой и знает правильное решение:
есть проект, на котором с помощью модуля subdomains выделены поддомены:
site.info
sub1.site.info
sub2.site.info

Каждый из поддоменов создается модулем автоматически через термины таксономии. Получается, что после присвоения наименования поддомена, статьи доступны по синониму: sub1.site.info/node/333. Соответственно, для каждой статьи можно было нажать "редактирование" после чего вызывался ckeditor.

С какого-то момента редактор перестал работать. Копание в отладке браузера показывает, что редактор не запускается, т.к. браузер воспринимает его запуск из поддомена sub1.site.info как межсайтовую атаку:
Access to XMLHttpRequest at 'https://www.site.info/ckeditor/xss' from origin 'https://sub1.site.info' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Попробовал настроить через модуль CORS для Drupal 7, получается еще более странный эффект - редактор запускается, но без текста. Кроме того, модуль CORS не поддерживается и, вроде, не доработан, вследствие чего, не понятно, как там настроить обращение с нескольких поддоменов? Можно ли для этого использовать .htaccess?

Комментарии

Аватар пользователя OldWarrior OldWarrior 12 января в 19:02

Shardach wrote: Можно ли для этого использовать .htaccess?

Видимо, для D7 это единственный универсальный выход. В D8 (начиная, по-моему, с 8.2) есть уже встроенная в ядро поддержка CORS, там всё наруливается конфигами Друпала.

Только, разумеется, следует явно перечислить целевые субдомены, избегая общих масок. Как-то так:

<IfModule mod_headers.c>
 Header set Access-Control-Allow-Origin https://site.info
 Header set Access-Control-Allow-Origin https://sub1.site.info
 Header set Access-Control-Allow-Origin https://sub2.site.info
</IfModule>
Аватар пользователя Shardach Shardach 13 января в 11:30

Спасибо! Я правильно понимаю, что надо указать для каждого домена отдельно с "www", без "www" и с "http://" и с "https://", т.е. 4 варианта?

То, что я разрешаю доступ с определенных доменов автоматом означает, что с них разрешены любые запросы?

Аватар пользователя Shardach Shardach 13 января в 19:14

Если указывать в формате
Header set Access-Control-Allow-Origin https://site.info
Header set Access-Control-Allow-Origin https://sub1.site.info
Header set Access-Control-Allow-Origin https://sub2.site.info

То используется только последняя запись (т.е. как будто из всех записей есть только https://sub2.site.info), т.е. надо либо как-то использовать маски или заводить в другом формате.

Аватар пользователя OldWarrior OldWarrior 14 января в 8:52
1

Shardach wrote: Я правильно понимаю, что надо указать для каждого домена отдельно с "www", без "www" и с "http://" и с "https://", т.е. 4 варианта?

Если уже есть явные перенаправления (например, в том же .htaccess), то скорее всего не нужно. По сути, директивы Access-Control-Allow-Origin только указание браузеру о разрешении обрабатывать кроссдоменные запросы на ресуры по определённым URL'ам.

Shardach wrote: о, что я разрешаю доступ с определенных доменов автоматом означает, что с них разрешены любые запросы?

Тут не понял, что имеется в виду.

Shardach wrote: То используется только последняя запись (т.е. как будто из всех записей есть только https://sub2.site.info), т.е. надо либо как-то использовать маски или заводить в другом формате.

Да, я неправильно вас сориентировал, прошу прощения. Под апачем обрабатывается только один заголовок Access-Control-Allow-Origin. Возможно, что-то из этого поможет:

https://stackoverflow.com/questions/1653308/access-control-allow-origin-...
https://stackoverflow.com/questions/20673882/handle-multiple-domains-wit...
https://gist.github.com/brianlmoon/2291111c5c69252c85f4

PS. Можно использовать и маски, просто преимущество явного задания всех субдоменов в читабельности конфигурации и сведению к минимуму случайных ошибок синтаксиса, связанных с использованием масок. То есть, тут вопрос скорее опыта и навыков работы с .htaccess

Аватар пользователя Shardach Shardach 14 января в 12:46

Ошибка пропадает после внесения в .htaccess следующих строчек:
SetEnvIf Origin "^http(s)?://(.+\.)?(domain\.info)$" origin_is=$0
Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is

К сожалению, при вызове статьи на редактирования редактор запускается без содержимого т.е. окно пустое. Ошибок в браузере больше нет, не понятно, куда копать.

Еще появился странный эффект после добавления строк в .htaccess - сайт периодически не грузится с сообщением об ошибке.

Аватар пользователя ant4 ant4 14 января в 18:17

В конеце .htaccess добавить

< IfModule mod_headers.c > //убрать лишние пробелы
    SetEnvIf Origin "http(s)?://(www\.)?(site\.info|sub1\.site\.info|sub2\.site\.info)$" origin_is=$0
    Header add Access-Control-Allow-Origin %{origin_is}e env=origin_is
    Header merge Vary Origin
< /IfModule > //убрать лишние пробелы

Возможно вместо Header add Access-Control-Allow-Origin надо Header set Access-Control-Allow-Origin

Аватар пользователя OldWarrior OldWarrior 14 января в 14:46

Shardach wrote: Еще появился странный эффект после добавления строк в .htaccess - сайт периодически не грузится с сообщением об ошибке.

Какое именно сообщение об ошибке? Что в журнале Друпала?

Аватар пользователя OldWarrior OldWarrior 14 января в 19:07

Shardach wrote: Ошибка пропадает после внесения в .htaccess следующих строчек:
SetEnvIf Origin "^http(s)?://(.+\.)?(domain\.info)$" origin_is=$0
Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is

Вот здесь есть другой пример для добавления именно 3-х доменов:
https://stackoverflow.com/questions/20673882/handle-multiple-domains-wit... . Возможно, имеет смысл попробовать.

<IfModule mod_headers.c>
    SetEnvIf Origin "http(s)?://(www\.)?(domain1.org|domain2.com|domain3.net)$" AccessControlAllowOrigin=$0$1
    Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
    Header set Access-Control-Allow-Credentials true
</IfModule>
Аватар пользователя Shardach Shardach 15 января в 18:10

OldWarrior wrote: Какое именно сообщение об ошибке? Что в журнале Друпала?

К сожалению, не могу воспроизвести, может быть это были проблемы на сервере... сама страница не грузилась т.е. до журнала Drupal не доходило.

Я вернулся к идеи, что надо подставлять заголовок через сам Drupal в зависимости от того, с какого домена вызван редактор. Использовал модулю CORS для Drupal - он уже как несколько лет не поддерживается, пришлось его дорабатывать напильником по bug report на сайте drupal.org, но в итоге проблему с заголовком это решило.

Теперь, когда редактор стартует, появилась следующая проблема - редактор пустой, т.е. существующий текст статьи куда-то пропадает...

У меня была еще мысль, заставить запускать ckeditor не с основного домена, а с поддомена т.к. файловая структура соответствует, но тоже не понятно, как это сделать...