Назад | Перейти на главную страницу

Apache 2.4: Header unset in <location> не работает</location>

Мы используем 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 ключевое слово).