Apache: разница между "Заголовок всегда установлен" и "Заголовок установлен"?
Вопросы
- В чем разница между
Header always set
а такжеHeader set
в апаче? - То есть, что делает
always
изменение ключевого слова об обстоятельствах, при которых установлен заголовок? - Должен ли я всегда устанавливать свои заголовки, используя
always
? - Есть ли причина не делать этого?
Фон
Я видел...
Header always set X-Frame-Options DENY
...так же как...
Header always set Access-Control-Allow-Headers "*"
... и я иногда слышу, что присутствие always
Ключевое слово гарантирует, что заголовок установлен правильно, или что просто лучше включить always
ключевое слово в общем. Однако я так и не нашел четкого и окончательного ответа, почему это так.
Я уже проверил документы Apache дляmod_headers
которые кратко упомянули always
:
Когда ваше действие является функцией существующего заголовка, вам может потребоваться указать условие всегда, в зависимости от того, в какой внутренней таблице был установлен исходный заголовок. Соответствующая всегда таблица используется для локально генерируемых сообщений об ошибках, а также для успешных ответы. Также обратите внимание, что повторение этой директивы с обоими условиями имеет смысл в некоторых сценариях, потому что всегда не является надмножеством onsuccess по отношению к существующим заголовкам:
- Вы добавляете заголовок к локально сгенерированному неуспешному (не 2xx) ответу, такому как перенаправление, и в этом случае в окончательном ответе используется только таблица, соответствующая всегда.
- Вы изменяете или удаляете заголовок, сгенерированный сценарием CGI, и в этом случае сценарии CGI находятся в таблице, соответствующей всегда, а не в таблице по умолчанию.
- Вы изменяете или удаляете заголовок, сгенерированный каким-либо элементом сервера, но этот заголовок не найден по умолчанию при условии успеха.
Насколько я могу судить, это означает, что Header set always
гарантирует, что заголовок установлен даже на не 200 страницах. Однако мои заголовки HTTP установлены с Header set
мне всегда казалось, что он отлично подходит для моих 404 страниц и тому подобное. Я что-то здесь неправильно понимаю?
FWIW, я нашел такие сообщения типа "В чем разница между"always "и" onsuccess "в конфигурации заголовка Apache?, но единственный ответ там на самом деле не объяснил это мне ясно.
Спасибо большое,
Калеб
1 ответ
В чем разница между установленным заголовком и заголовком в Apache?
Как говорит цитата из руководства, без "всегда" ваши дополнения будут выходить только при успешных ответах.
Но это также включает в себя "успешно" ошибки пересылки через mod_proxy и, возможно, другие подобные обработчики, которые примерно действуют как прокси. Что генерирует ваши 404, которые, как вы обнаружили, не согласны с руководством? 404 в локальном файле, безусловно, ведет себя так, как описано в кавычках.
То есть, что меняет ключевое слово Always в тех обстоятельствах, при которых установлен заголовок?
API Apache хранит два списка, связанных с каждым запросом, заголовки и err_headers. Первый не используется, если сервер обнаружил ошибку при обработке запроса, второй.
Должен ли я всегда устанавливать свои заголовки, используя всегда?
Это зависит от их значения. Допустим, вы устанавливали заголовки Cache-Control, связанные с тем, что вы ожидали использовать для какого-либо ресурса. Теперь предположим, что вы на самом деле обслуживали что-то вроде 400 или 502. Возможно, вы не хотите, чтобы это кэшировалось!
Есть ли причина не делать этого?
Смотри выше.
- / -
В руководстве, которое вы не процитировали, есть также бит, объясняющий прокси или CGI кода ошибки, но не тот, для которого Apache генерирует ответ об ошибке:
Необязательный аргумент условия определяет, с какой внутренней таблицей заголовков ответов будет работать эта директива. Несмотря на имя, значение по умолчанию onsuccess не ограничивает действие ответами с кодом состояния 2xx.
Заголовки, установленные в этом условии, по-прежнему используются, когда, например, запрос успешно проксируется или генерируется CGI, даже если они сгенерировали ошибочный код состояния.