2012-02-24 51 views
2

我發現這裏幾個相關的問題重發後在304響應頭未修改

我想要做的太是實施拉請求處理FO我的同步服務,告訴是否有任何用戶的數據庫中的對象的任何更改。如果進行了更改,我使用對象名稱及其ID進行回覆。如果沒有變化,我會發送一個304 Not Modified響應。

爲了控制這些請求的頻率,我帶着一個想法,在所有響應中添加一個Retry-After標題。問題在於,當304響應被髮送時,Apache會剪切所有頭文件。

根據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中,他們是:

連接,保持活動,ETag的,內容位置,過期,緩存控制,因人而異,警告,WWW身份驗證,代理服務器進行身份驗證,設置Cookie,套裝 - 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似乎表明Retry-After合理的304點回應:

...此字段也可以與任何3xx(重定向)響應一起使用表示在發出重定向請求之前用戶代理程序要求等待的最短時間。 ...