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