304 Not Modified上的Retry-After响应头

时间:2012-02-24 11:07:49

标签: http apache2 http-headers

我在这里找到了几个相关的问题

我正在尝试的是为我的同步服务实现拉请求处理程序,该服务器告知数据库中的任何用户对象是否有任何更改。如果进行了更改,我会回复一个对象名称及其ID的列表。如果没有变化,我会发送304 Not Modified回复。

为了控制这些请求的频率,我想到了在所有响应中添加Retry-After标头的想法。问题是Apache在发送304响应时会切断所有标头。

根据RFC2616

  

如果条件GET使用了强缓存验证器(参见章节)   13.3.3),响应不应包括其他实体标题。

但Retry-After不是实体标题。我错了还是错过了什么?

有没有解决方法? 如果无法解决这个问题(使用Retry-After标头进行304响应),在这种情况下还有哪些其他选择?使用204 No Content代替304 Not modified似乎是否合理?

1 个答案:

答案 0 :(得分:2)

事实证明,Apache针对hard-coded set标题名称过滤了 304 Not Modified 响应。对于2.2.x版,它们是:

  

连接,保持活动,ETag,内容位置,过期,缓存控制,变化,警告,WWW-身份验证,代理验证,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?


请注意:尽管Apache已经实施,但RFC2616似乎表明{304}回复Retry-After 是合理的:

  

...此字段也可以与任何3xx(重定向)响应一起使用,以指示在发出重定向请求之前用户代理被要求等待的最短时间。 ......