Заголовок ответа Retry-After на 304 Не изменен
Я нашел пару связанных вопросов здесь
- Apache игнорирует PHP заголовки при отправке 304
- Ответ 304 не устанавливает пользовательский заголовок для apache с mod_headers
То, что я тоже пытаюсь сделать, это реализовать обработчик запросов на получение запросов для моей службы синхронизации, который сообщает, есть ли какие-либо изменения в объекте любого пользователя в базе данных. Если были внесены изменения, я отвечаю списком имен объектов и их идентификаторами. Если нет изменений, я отправляю 304 Not Modified
ответ.
Чтобы контролировать частоту этих запросов, я пришел с идеей добавить Retry-After
заголовок во всех ответах. Проблема в том, что Apache обрезал все заголовки при отправке ответа 304.
Согласно RFC2616
Если условный GET использовал сильный валидатор кэша (см. Раздел 13.3.3), ответ НЕ ДОЛЖЕН включать другие заголовки объекта.
Но Retry-After не является заголовком объекта. Я ошибаюсь или что-то упустил?
Есть ли обходные пути? Если это не может быть решено (ответ 304 с заголовком Retry-After), каковы другие варианты в этой ситуации? Кажется ли разумным использовать 204 No Content
вместо 304 Not modified
?
1 ответ
Оказывается, что Apache фильтрует 304 не измененных ответов по жестко заданному набору имен заголовков. Для версии 2.2.x они:
Соединение, Keep-Alive, ETag, Content-Location, Expires, Cache-Control, Vary, Warning, WWW-Authenticate, Proxy-Authenticate, Set-Cookie, Set-Cookie2
Один из обходных путей - перегрузить заголовок в этом списке. Например, вы можете использовать заголовок Warning:
header("Warning: X-Retry-After: 60"); //tested on Apache 2.2.3 / PHP5.1.6
И обратите внимание: несмотря на реализацию Apache, RFC2616 предполагает, что Retry-After оправдан на 304 ответах:
... Это поле МОЖЕТ также использоваться с любым ответом 3xx (Перенаправление), чтобы указать минимальное время, в течение которого пользовательский агент должен ждать ожидания перед отправкой перенаправленного запроса....