Apache: разница между "Заголовок всегда установлен" и "Заголовок установлен"?

Вопросы

  1. В чем разница между Header always set а также Header set в апаче?
  2. То есть, что делает always изменение ключевого слова об обстоятельствах, при которых установлен заголовок?
  3. Должен ли я всегда устанавливать свои заголовки, используя always?
  4. Есть ли причина не делать этого?

Фон

Я видел...

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, даже если они сгенерировали ошибочный код состояния.

Другие вопросы по тегам