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

Пользовательские заголовки (mod_headers) не отображаются в сочетании с mod_rewrite

У меня есть виртуальный хост с несколькими связанными с ним доменными именами. Я пытаюсь отправить дополнительные заголовки, когда делается запрос к одному конкретному доменному имени.

Вот что я делаю (пробовал как в vhost, так и в .htaccess, результаты такие же)

SetEnvIf HOST thishost THETAG=noindex
Header set X-Robots-Tag "%{THETAG}e" env=THETAG
Header set X-Robots-Test "Yes"

Таким образом, заголовок X-Robots-Test всегда должен присутствовать. X-Robots-Tag должен присутствовать только в том случае, если установлен заголовок THETAG, который устанавливается, только если заголовок хоста содержит "thishost".

RewriteRule выглядит примерно так, поэтому в основном 301 перенаправление со страницы 1 на страницу 2.

RewriteRule page1 page2 [L,R=301]

Когда делается запрос на страницу 2, заголовки отображаются правильно, но когда запрос выполняется на страницу 1 (и перенаправляется с помощью mod_rewrite), заголовки отсутствуют (даже тестовый заголовок).

Когда перенаправление инициируется из сценария PHP, а не из mod_rewrite, заголовки отображаются, поэтому я предполагаю, что проблема в том, что mod_rewrite имеет приоритет над mod_headers. Есть ли способ исправить это?

Как сказал @Zimmi в комментариях, заголовки применяются только к ответам «Успешно» (коды HTTP 2xx). Перенаправления представляют собой коды 3хх и поэтому не получают заголовок.

Если вы используете Header set … затем используйте Header always set …. Если вы используете другое действие (добавить, добавить и т. Д.), Используйте соответствующее действие.

Обратите внимание, что вы не должны слепо «всегда устанавливать». Из документы:

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

Вы добавляете заголовок к неуспешному (не 2xx) ответу, например к перенаправлению, и в этом случае в окончательном ответе используется только таблица, соответствующая always. Вы изменяете или удаляете заголовок, созданный сценарием CGI, и в этом случае сценарии CGI находятся в таблице, соответствующей всегда, а не в таблице по умолчанию. Вы изменяете или удаляете заголовок, сгенерированный некоторой частью сервера, но этот заголовок не обнаруживается условием при успешном завершении по умолчанию.

Для заголовков HSTS (это то, что я пытался добавить к канонизации домена), это кажется правильным подходом.