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 используется слабый валидатор) ответ НЕ ДОЛЖЕН включать другие заголовки объекта; это предотвращает несоответствия между кешированными сущностями и обновленными заголовками.

с http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Начиная с 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 не может повредить мне.

Пытаться:

header('Foo: bar', true, 304);
Другие вопросы по тегам