Мы используем apache 2.4 для обслуживания наших сайтов, созданных с помощью typo3.
В общем, мы хотим, чтобы X-Frame-Options SAMEORIGIN
Заголовок присутствует для всех запросов.
За одним исключением. Для определенного URL-адреса этот заголовок не должен быть установлен, поскольку он должен использоваться внутри iFrame из другого домена.
Я добавил что-то вроде этого:
Header always set X-Frame-Options SAMEORIGIN
<Location /anotherURL>
Header always unset X-Frame-Options
</Location>`
Когда я пытаюсь запросить данный URL https://www.example.com/
Я вижу X-Frame-Options
-Заголовок в ответе, но с https://www.example.com/anotherURL
этот заголовок все еще присутствует.
Я проверил, что директива Location действительно обрабатывается путем добавления Require all denied
к директиве Location. Когда он активен, доступ к URL /anotherURL
отклонено, как и ожидалось.
Если я изменю Местоположение с /anotherURL
к /typo3
отключение работает, как ожидалось.
Единственная разница, которую я вижу между этими двумя URL-адресами, заключается в том, что /typo3
существует в структуре каталогов под htdocs, поэтому /anotherURL
- это URL, обрабатываемый Typo3.
У меня вопрос: почему Apache игнорирует мою команду Header unset? С точки зрения Apache, он не должен знать, что делает Typo3, как только он сгенерирует заголовок ответа, директива Location должна соответствовать (что, очевидно, и делает) и обработать команды внутри.
Я просмотрел некоторые другие вопросы, касающиеся проблем с отключением заголовков HTTP, но никакие предложения не решили мою конкретную проблему.
Вот мои выводы по этому поводу:
Основная проблема, почему мои операторы Header не выполняются внутри Location-Directive, заключается в mod_rewrite.
Один раз запрос с виртуальным URL-адресом, например /anotherURL
, для которого не существует физического объекта, mod_rewrite немедленно начинает применять свои правила. Здесь он отображает его на /index.php
и подталкивает информацию /anotherURL
в GET-параметры, которые позже используются для идентификации страницы Typo3.
Это объясняет, почему операторы заголовка не выполняются, местоположение запроса изменилось.
Теперь к решению, которое мне подходит. Поскольку я не могу полагаться на URL-адрес, мне нужно найти другую информацию. Мне Referer очень подходит:
SetEnvIf Referer ^https:\/\/www.(location1|location2).de\/test\.html$ IFRAME_ENV
Header always set X-Frame-Options "sameorigin" env=!IFRAME_ENV
Сделаем свое дело.
Теперь для каждого запроса проверяется реферер. По умолчанию добавляется заголовок X-Frame-Otions, за исключением случаев, когда для реферера заданы два URL-адреса, из которых я хочу разрешить встраивание iFrame.
Если кто-нибудь знает, как применять директивы Location до того, как сработает mod_rewrite, я очень открыт для такого решения :) До тех пор, пока это не сработает для меня.
Спасибо всем за поддержку.
Попробуй это:
<Location /anotherURL>
Header always unset X-Frame-Options
Header unset X-Frame-Options
</Location>
Было то же самое с бэкэндом Jboss, который не отключал заголовок, а выше исправил его. Не могу вспомнить, почему снова сейчас (что-то связано с порядком обработки при включении always
ключевое слово).