Заголовок ответа Retry-After на 304 Не изменен

Я нашел пару связанных вопросов здесь

То, что я тоже пытаюсь сделать, это реализовать обработчик запросов на получение запросов для моей службы синхронизации, который сообщает, есть ли какие-либо изменения в объекте любого пользователя в базе данных. Если были внесены изменения, я отвечаю списком имен объектов и их идентификаторами. Если нет изменений, я отправляю 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

См. Также: Добавление подробного сообщения об ошибке REST в заголовок предупреждения HTTP, хорошая / плохая идея?


И обратите внимание: несмотря на реализацию Apache, RFC2616 предполагает, что Retry-After оправдан на 304 ответах:

... Это поле МОЖЕТ также использоваться с любым ответом 3xx (Перенаправление), чтобы указать минимальное время, в течение которого пользовательский агент должен ждать ожидания перед отправкой перенаправленного запроса....

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