Добрый день, может кто сталкивался с подобной проблемой и знает правильное решение:
есть проект, на котором с помощью модуля 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?
Комментарии
Видимо, для D7 это единственный универсальный выход. В D8 (начиная, по-моему, с 8.2) есть уже встроенная в ядро поддержка CORS, там всё наруливается конфигами Друпала.
Только, разумеется, следует явно перечислить целевые субдомены, избегая общих масок. Как-то так:
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>
Спасибо! Я правильно понимаю, что надо указать для каждого домена отдельно с "www", без "www" и с "http://" и с "https://", т.е. 4 варианта?
То, что я разрешаю доступ с определенных доменов автоматом означает, что с них разрешены любые запросы?
Если указывать в формате
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), т.е. надо либо как-то использовать маски или заводить в другом формате.
Если уже есть явные перенаправления (например, в том же .htaccess), то скорее всего не нужно. По сути, директивы Access-Control-Allow-Origin только указание браузеру о разрешении обрабатывать кроссдоменные запросы на ресуры по определённым URL'ам.
Тут не понял, что имеется в виду.
Да, я неправильно вас сориентировал, прошу прощения. Под апачем обрабатывается только один заголовок 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
Ошибка пропадает после внесения в .htaccess следующих строчек:
SetEnvIf Origin "^http(s)?://(.+\.)?(domain\.info)$" origin_is=$0
Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is
К сожалению, при вызове статьи на редактирования редактор запускается без содержимого т.е. окно пустое. Ошибок в браузере больше нет, не понятно, куда копать.
Еще появился странный эффект после добавления строк в .htaccess - сайт периодически не грузится с сообщением об ошибке.
В конеце .htaccess добавить
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
Какое именно сообщение об ошибке? Что в журнале Друпала?
Вот здесь есть другой пример для добавления именно 3-х доменов:
https://stackoverflow.com/questions/20673882/handle-multiple-domains-wit... . Возможно, имеет смысл попробовать.
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>
К сожалению, не могу воспроизвести, может быть это были проблемы на сервере... сама страница не грузилась т.е. до журнала Drupal не доходило.
Я вернулся к идеи, что надо подставлять заголовок через сам Drupal в зависимости от того, с какого домена вызван редактор. Использовал модулю CORS для Drupal - он уже как несколько лет не поддерживается, пришлось его дорабатывать напильником по bug report на сайте drupal.org, но в итоге проблему с заголовком это решило.
Теперь, когда редактор стартует, появилась следующая проблема - редактор пустой, т.е. существующий текст статьи куда-то пропадает...
У меня была еще мысль, заставить запускать ckeditor не с основного домена, а с поддомена т.к. файловая структура соответствует, но тоже не понятно, как это сделать...