2011-11-28 41 views
35

我有這頭由服務器發送到客戶端:Chrome瀏覽器不發送的If-Modified-Since標題到服務器

Cache-Control:private 
Connection:keep-alive 
Content-Encoding:gzip 
Content-Type:text/html 
Date:Sun, 27 Nov 2011 11:10:38 GMT 
ETag:"12341234" 
Set-Cookie:connect.sid=e1u...7o; path=/; expires=Sun, 27 Nov 2011 11:40:38 GMT; httpOnly 
Transfer-Encoding:chunked 
last-modified:Sat, 26 Nov 2011 21:42:45 GMT 

我想在客戶端驗證該文件,都沒有改變服務器併發送一個「200」,如果它有其他的「304」。

火狐發送:

if-modified-since: Sat, 26 Nov 2011 21:42:45 GMT 
if-none-match: "12341234" 

爲什麼不屬於Chrome發送相同頁面的刷新?我在.Net運行的行爲之後:

context.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate) 
+0

我不明白「的行爲後,我就是.Net運行:「。你可以編輯它嗎?這個問題對我很重要。 –

+0

這是一個讓你在.Net中的':'後面運行代碼的行爲。看着這些標籤,我試圖模仿node.js中的行爲。 – Asken

+0

對於所有認爲這是客戶端問題並對這些答案投票的人。請閱讀下面的內容:這與服務器相關,因爲我在使用etag('if-none-match')發出瀏覽器請求之後。 etag是在服務器端創建的,與客戶端無關。我需要知道的是從服務器發送到客戶端的內容,以使它也可以通過chrome發送etag頭文件。所選答案是唯一正確的答案,因爲它告訴服務器也發送'if-none-match'。 – Asken

回答

9

根據我的經驗,您需要的不僅僅是「專用」緩存控制標頭。您需要「Max-Age」或「Expires」強制Chrome重新驗證服務器的內容。

請記住,重新驗證只會在這些時間值過去後纔開始,因此可能需要將其設置爲較小的值。

+0

我試過cache-control:private,max-age = 0。沒有工作......任何其他想法?我也添加了過期標題,但仍然沒有去。 – Asken

+0

其實......應該是max-age = 100000什麼的。幾乎得到它的工作。讓它發送if-none-match有些時候,這是它的行爲。謝謝! – Asken

+0

我通常將Max-age設置爲1小時,但完全取決於您更新靜態內容的頻率。如果不確定保持低價值是否安全。 –

53

在昨天花了半天時間之後,我追查了是什麼導致了我的問題。只要您點擊F12時彈出的Chrome對象檢查器/客戶端調試器/網絡監視器/事物,Chrome就不會發送緩存請求標頭。期。 (更新:在較新版本的Chrome中,有一個複選框「禁用緩存」)。即使你沒有打開「網絡」選項卡(例如:打開javascript控制檯),該複選框仍會禁用所有緩存。

令人傷心的是,因爲從客戶端進行調試必須讓您打開網絡面板以查看正在發送和接收哪些標頭以及正在返回哪些代碼。如果沒有打開網絡面板,則無法知道您的內容是否從客戶端緩存。

如果您深入瞭解服務器訪問日誌,您會注意到在您關閉Chrome客戶端上的調試窗口時,服務器會返回304s(緩存內容)。希望這可以幫助。

的Chrome 24.0.1312.57

+43

開發工具有一個選項「禁用緩存(DevTools打開時)」,也許你已經啓用了?點擊右下角的'齒輪'圖標並檢查您的設置。 – Neek

+0

+1(是的,你需要取消選中「Disable cache(DevTools is open)」)。 –

+2

這不是答案,答案與服務器有關。 – Asken

24

我找到一個答案,這種行爲使用HTTPS時,想我會分享我發現了什麼。您不指定是否通過HTTP或HTTPS請求。

「規則其實很簡單:任何證書錯誤都意味着頁面不會被緩存。」

https://code.google.com/p/chromium/issues/detail?id=110649

如果您使用的是自簽名證書,即使你在Chrome中添加一個例外它使頁面加載時,從該頁面沒有資源將被緩存,並且請求也不會有一個If-Modified-Since標題。

+0

這似乎不再是真的。我有一個瀏覽器爲某些資源發送'if-modified-since'標頭的頁面,並且不會將它們發送給其他人。 – pbanka

+0

與之前的評論相反,我剛剛看到同樣的確切行爲。 If-Modified-Since沒有在我有無效證書的環境中發送,但是當我有一個有效的證書時發送它。 – dmccabe

+0

謝謝,我也有這個問題。 我在開發機器上使用自簽名證書進行測試。 作爲一項測試,我暫時信任證書,並開始按照您的預期獲得304。 – Steviebob

0

我知道這個問題是舊的,但仍然.. 我注意到,鉻記得您所做的最後一次刷新。所以如果按ctrl + shift + r(刷新和刪除緩存),並按ctrl + r(只是刷新),chrome會繼續刪除緩存,並且不會在收到的響應中顯示304。這是一個解決方法。按ctrl + shift + r,然後轉到地址欄,將其聚焦,然後按Enter鍵。如果您的etags設置正確,並且您的服務器已準備好提供304服務,您將在調試器中看到一個新的響應代碼 - 304.因此它可以工作。

+0

這不是客戶端問題... – Asken

+0

我在多個網站上觀察到此行爲。客戶端錯誤與否,知道有時cmd + r可能還不夠,這還是很好的。 –

+1

接受的答案將有助於網站不工作,並且不會強制網站用戶做他們不應該做的事情。 – Asken

4

另外(https://stackoverflow.com/a/14899869/362780):

F12>設置>常規>禁用緩存(而DevTools是打開的) - >取消此...

+0

未選中禁用緩存,問題依然存在。我正在運行版本58.0.3029.110(64位)。 – Reado

相關問題