2011-07-09 49 views
5

我們正在努力減少一些「毫無意義」的流量。用404響應發送cache-control/expires/pragma - 現代瀏覽器有效/理解嗎?

如果我們用404響應發送有效的緩存控制頭(a-la「do cache」),現代瀏覽器會緩存請求的資源不存在嗎?

我們使用自定義的基於PHP的404處理程序,由於創建會話而發送不緩存標頭,所以我們刪除了這些標頭。但現在想知道是否對於資源我們是一定是無效的,我們是否應該發送適當的緩存頭?

這些是公共資源btw由所有用戶訪問相同的uri。

謝謝!

+1

請爲您設置的緩存標題以及如何命名。 – hakre

回答

10

現代瀏覽器的HTTP Protocol的實現接近標準,對於代理服務器也是如此,如果您希望對用戶和非故意的僵屍網絡流量產生影響,您應該考慮這些代理服務器。目前version is 1.1,一些摘錄:4XX

的4XX類的狀態代碼是用於在客戶端似乎有錯誤的情況下

10.4客戶端錯誤。除了響應HEAD請求之外,服務器應該包含一個包含錯誤情況說明的實體,以及它是臨時還是永久性條件。這些狀態碼適用於任何請求方法。用戶代理應該向用戶顯示任何包含的實體。

如果客戶端正在發送數據,使用TCP的服務器實現應該小心,以確保客戶端在服務器關閉輸入連接之前確認收到包含響應的數據包。如果客戶端在關閉後繼續向服務器發送數據,則服務器的TCP堆棧將向客戶端發送重置數據包,這可能會在HTTP應用程序可以讀取和解釋客戶端的未確認輸入緩衝區之前擦除它們。

更具體地爲404:

10.4.5 404未找到

服務器沒有找到任何匹配的Request-URI。沒有跡象表明病情是暫時的還是永久性的。如果服務器通過某種內部可配置機制知道舊資源永久不可用並且沒有轉發地址,則應使用410(Gone)狀態碼。當服務器不希望揭示請求被拒絕的原因時,或者沒有其他響應適用時,通常使用此狀態碼。

對於404響應代碼非常重要。

你問:

現在(我們)想知道如果資源,我們一定是無效的,我們應該正確發送緩存頭?

您還沒有給出任何您想使用的特定緩存標頭,因此回答您的問題有點不莊重。緩存是協議規範中的一部分:13 Caching in HTTP

大致有如下應你在找什麼,摘自13.1.1 Cache Correctness

正確的緩存必須與通過適當的緩存中保存最先進的最新響應的請求作出迴應於該請求(見章節13.2.5,13.2.6,和13.12),其滿足下列條件之一:

...

3. It is an appropriate 304 (Not Modified), 305 (Proxy Redirect), 
    or error (4xx or 5xx) response message. 

因此,您可以緩存404響應消息並將其發送給緩存。代理和客戶端應該處理它。

+0

是啊,這實際上使很多道理......我們最終會做的是a)如果沒有if-modified-since頭,發送緩存頭+自定義404頁面,b)如果是如果修改 - 自頭,發送304沒有修改身體代碼W/O正文。謝謝。 –

+2

@ anonymous-one:那麼這會給你頭部往返404腳本的PHP腳本,因爲它仍然會被調用,所以沒有任何意義。如果您真的確定該資源無效,請允許緩存幾天,並且不要執行「自修改後」之類的任何操作。只要讓它緩存起來。如果您可以識別用戶實際正在查找的資源,則可以使用410 Gone代替,或者將302與位置標題和新位置一起移動,這樣您就可以在搜索引擎和外部資源中保持鏈接。讓這個響應緩存幾天。 – hakre

相關問題