Apache игнорирует PHP заголовки при отправке 304
Когда я устанавливаю пользовательский заголовок в Apache + mod_php5, это прекрасно работает:
header('Foo: Bar');
Но когда я пытаюсь сделать это при отправке ответа 304 Not Modified, кажется, что заголовок удаляется apache (вместе с X-Powered-By и другими стандартными заголовками).
header('HTTP/1.1 304 No Content');
header('Foo: Bar');
Кто-нибудь знает, как решить эту проблему?
3 ответа
Разве это не отвечает на вопрос?
Если условный GET использовал сильный валидатор кэша (см. Раздел 13.3.3), ответ НЕ ДОЛЖЕН включать другие заголовки объекта. В противном случае (т. Е. В условном GET используется слабый валидатор) ответ НЕ ДОЛЖЕН включать другие заголовки объекта; это предотвращает несоответствия между кешированными сущностями и обновленными заголовками.
Начиная с Apache 2.4.23 (насколько я знаю, последний выпуск на сегодняшний день), вы не сможете обойти эту проблему, когда отправите ответ 304 "Not Modified", потому что действительно Apache делает явным образом удалите все заголовки без белого списка:
http://svn.apache.org/viewvc/httpd/httpd/tags/2.4.23/modules/http/http_filters.c?view=markup#l1331
Итак, нравится нам это или нет (потому что я нахожусь в том же положении, когда Apache удаляет мои заголовки CORS из ответа, когда я отправляю 304), похоже, что Apache следует рекомендации RFC и действительно лечит все который выходит за пределы этого списка как заголовки объекта.
Одним из решений является исправление исходного кода Apache, чтобы расширить этот список и перейти к развертыванию собственного пакета на своих серверах, но это определенно не без длинного списка собственных последствий. С другой стороны, я слышал, что nginx не страдает от этой проблемы.
Содержимое, которое я доставляю, будет потребляться, среди прочего, средами выполнения WebGL в стандартных браузерах, поэтому, если они будут жаловаться на отсутствие CORS в моих 304 ответах, мне придется повернуть все на 200 ОК и отказаться от экономия полосы пропускания.
Я делаю трюк, чтобы решить эту проблему: 1. помещаю весь заголовок перед заголовком 304 2. очищаю эти заголовки перед отправкой 304
header('Foo: Bar');
flush();
header('HTTP/1.1 304 No Content');
Apache не удалит заголовок, пока не найдет 304. Мы принудительно отправляем другой заголовок с помощью flush() перед отправкой 304. Этот apache не может повредить мне.