Заголовок ответа Retry-After на 304 Не изменен - PullRequest
2 голосов
/ 24 февраля 2012

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

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

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

Согласно RFC2616

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

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

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

1 Ответ

2 голосов
/ 20 сентября 2012

Оказывается, что 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 (Перенаправление) , чтобы указать минимальное время, которое пользователь-агент должен ждать перед отправкой перенаправленного запроса....

...