2016-05-02 5 views
3

У меня есть сайт, где виртуальные хосты определены в /etc/apache2/sites-enabled/ с заголовком быть установлен с always опции, как это:В чем разница между «всегда» и «onsuccess» в конфигурации заголовка Apache?

Header always set X-Frame-Options DENY 

Если я теперь установлен один и тот же заголовок, используя .htaccess в корневой папке веб-сайта, но без always, тогда заголовок возвращается дважды в ответе сервера.

Установка в .htaccess (среди прочих):

Header set X-Frame-Options DENY 

Ответ сервера:

HTTP/1.1 200 OK 
Date: Mon, 02 May 2016 16:02:29 GMT 
Server: Apache/2.4.10 (Debian) 
X-Frame-Options: DENY 
Cache-Control: no-cache, no-store, must-revalidate, private 
Pragma: no-cache 
X-XSS-Protection: 1 
X-Content-Type-Options: nosniff 
Last-Modified: Mon, 02 May 2016 15:03:42 GMT 
Accept-Ranges: bytes 
Content-Length: 0 
X-Frame-Options: DENY 
X-XSS-Protection: 1 
X-Content-Type-Options: nosniff 
Cache-Control: no-cache, no-store, must-revalidate, private 
Pragma: no-cache 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/html 

Документы Apache говорят, что без опции always используется значение по умолчанию onsuccess. Но они также говорят, что «... значение по умолчанию onsuccess не ограничивает действие ответами с кодом состояния 2xx ...» (http://httpd.apache.org/docs/current/en/mod/mod_headers.html#header).

Но если я не добавлю always, тогда страницы ошибок, такие как 301 и 404, не будут иметь набор заголовков. С другой стороны, если я добавлю always, тогда заголовки могут быть установлены дважды, если я использую значение по умолчанию (т. Е. onsuccess) в .htaccess. Как указано в docs: «повторение этой директивы с обоими условиями имеет смысл в некоторых сценариях, потому что всегда не является надмножеством onsuccess в отношении существующих заголовков». Настройка заголовков дважды не всегда действительна для ответа HTTP, см. https://stackoverflow.com/a/4371395/641481. Поэтому я хочу избежать этого, естественно.

Мой вопрос сейчас: когда я должен использовать onsuccess (т. Е. Значение по умолчанию) и когда always? Должен признаться, что даже после прочтения документов Apache пару раз я не совсем понимаю это. Прагматично кажется, что всегда использование always приводит к правильному/ожидаемому поведению.

Я также не понимаю, почему Apache записывает заголовок дважды, если он установлен в always и onsuccess. Мне кажется, что это неправильно, но для этого должна быть веская причина, так как я полагаю, что Apache-разработчики знают намного больше, чем о HTTP ;-)

ответ

-1

Это лишь частичный ответ, поскольку он не распространяется атрибут onsuccess. Он основан на опыте использования apache 2.4.7 на Ubuntu 14 os. Надеюсь, это поможет вам.

Чистый set параметр, без атрибутов, к Header директивы перезапишет always атрибут, заставляя аргумент Header set быть только один доставлен. Если одна и та же директива появляется в каталоге, то есть файл с файловой системой .htaccess имеет приоритет над той же директивой, указанной в файле определения виртуального хоста, относящемся к этому каталогу. Если атрибут always отмечен дополнительно, это означает, что любая, равная или различная нотация одной и той же директивы добавляется к серверному ответу вместо того, чтобы переписывать/заменять его.

Возможно, атрибут onsuccess, к которому у меня, к сожалению, нет времени для изучения, может быть обработан аналогично атрибуту always.

+0

После обширного тестирования нет, '' set always'' НЕ переопределяет '' set''. – user5994461

+0

@ user5994461: Вы, кажется, неправильно поняли мои слова: в первом предложении первого абзаца говорится, что «Заголовок» устанавливает «всегда переопределяет», но не говорит «всегда» переопределяет «набор». Ваши тесты просто подтвердили мою публикацию. Пожалуйста, верните вниз. –

+0

Неправильно. Набор не переопределяет всегда и всегда не отменяет набор. Они работают независимо, если оба используются, HTTP-ответ получит 2 заголовка. – user5994461