2012-02-24 1 views
2

Я нашел пару связанные вопросы здесьRetry-After заголовка ответа на 304 Not Modified

То, что я пытаюсь сделать, это тоже реализовать нагрузочный обработчик запросов Ф.О. моя служба синхронизации, которая сообщает, были ли какие-либо изменения в объекте любого пользователя в базе данных. Если изменения были сделаны, я отвечаю на список имен объектов и их идентификаторов. Если изменений нет, отправлю ответ 304 Not Modified.

Чтобы контролировать частоту этих запросов, я пришел с идеей добавить заголовок Retry-After во все ответы. Проблема в том, что Apache вырезал все заголовки, когда отправлено 304 ответа.

Согласно RFC2616

Если условный GET используется сильный валидатор кэша (смотрите раздел 13.3.3), ответ НЕ ДОЛЖЕН включать другие заголовков объекта.

Но Retry-After не является заголовком объекта. Я что-то не так или что-то потерял?

Есть ли обходные пути? Если это невозможно решить (ответ 304 с заголовком Retry-After), каковы другие варианты в этой ситуации? Возможно ли использовать 204 No Content вместо 304 Not modified?

ответ

2

Оказалось, что фильтры Apache 304 Не модифицировано ответы против hard-coded set имен заголовков. Для версии 2.2.x они:

соединение, Keep-Alive, ETag, Content-Location, Expires, Cache-Control, Вары, предупреждение, WWW-Authenticate, Proxy-Authenticate, Set-Cookie, Set- Cookie2

Одним из способов является перегрузка заголовка в этом списке. Например, вы могли бы злоупотреблять заголовок Предупреждения:

header("Warning: X-Retry-After: 60"); //tested on Apache 2.2.3/PHP5.1.6 

Также смотрите: Putting detailed REST error message in HTTP Warning header, good/bad idea?


И обратите внимание: несмотря на осуществление Апача, RFC2616, кажется, предполагают, что Retry-Afterявляется разумным на 304 ответов:

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

Смежные вопросы