2012-02-17 83 views
16

我看了http://code.google.com/speed/page-speed/docs/caching.html。它說,代理服務器可能會緩存cookie。我需要澄清。代理緩存 - 怎麼樣?


比方說,我有這個頭我的文件:Cache-Control "max-age=604800, public"
Q.1。有了這個標題,當一個靜態文件被訪問時,來自一個人計算機的cookie會被緩存在代理服務器上嗎? (然後,將旁邊的人訪問該文件拿起其他人的餅乾?)


現在,讓我們說緩存代碼去像Cache-Control "max-age=7200, proxy-revalidate"代替。
Q.2。至於cookie緩存在代理服務器上會有什麼區別?


現在我有一個關於實際設置 Cookie(例如Javascript或PHP)的文件的問題。
Q.3。訪問這些類型的文件時,Cookie是否會被緩存在代理服務器上?或者緩存與靜態文件相同?


如果你想知道,我問這些事情的原因是因爲我做一個人的餅乾進行代理緩存,因此轉移到另一個人。所以任何澄清都會有幫助。非常感謝!


編輯:
非常感謝所有幫助。但我仍然需要更多的澄清。

如果我有使用頭文件Cache-Control "max-age=604800, public",將任何請求中的Cookie(Cookie)或響應餅乾(Set-Cookie)進行(在高速緩存中自)轉移到其他用戶的計算機?或者它會緩存只有爲那個人用戶的瀏覽?如果設置爲Cache-Control "max-age=7200, proxy-revalidate",那麼怎麼辦?再次感謝。

回答

17

這取決於代理和Vary響應標頭。通常,代理不會緩存對具有Cookie標頭的請求的響應。但是,這並不能保證。

當您使用指令public指定Cache-Control標頭時,您要求代理共享不同客戶端之間的緩存。這大概是不是你的意圖,所以你應該指定private來代替。請參閱:http://www.mnot.net/cache_docs/#CACHE-CONTROL

至於cookie緩存在代理服務器上會有什麼差別?

不是。它所做的只是告訴代理它不應該從一個陳舊的緩存中提供服務。它不會影響緩存的控制方式。

訪問這些類型的文件時,Cookie是否會緩存在代理服務器上?或者緩存與靜態文件相同?

對於http級別的軟件(例如代理),靜態和動態內容沒有區別。 Cookie是如果設置在瀏覽器(或者通過Javascript或從服務器端的cookie與某個請求(Cookie報頭)發送或發送與響應(Set-Cookie頭)

,通過Set-Cookie僅僅HTTP報頭頭部),瀏覽器將發回cookie並將所有後續請求發送到同一個域。它通過在請求中添加一個Cookie標題來實現。

編輯:

我不希望我的實際文件要在代理緩存,而不是個人用戶的Cookie。我該怎麼做呢?

你需要避免緩存任何響應,要麼:

  • 包含一個Set-Cookie頭(因爲這會通過代理獲取緩存)
  • 沒有在服務器端的副作用(如爲您的應用程序接收請求是很重要的 - 例如,它是沒有意義的緩存跟蹤像素)
  • 凡要求Cookie頭決定了獲取呈現(如打印內容「歡迎回來,李四」或其他 定製)

你會怎麼做取決於你的後端技術。這是你的應用程序,它知道Cookie頭是否是響應還是響應可能包含一個Set-Cookie頭顯著。

在我所使用的應用程序框架,有一個設置緩存由-Expires頭的功能。如果我在相同的請求訪問cookie中調用該cookie,則會出現錯誤。這確保我不會不小心要求代理緩存私人內容。您需要在應用程序中實現類似的邏輯。

或者,您也可以配置邊緣級別的代理做同樣的事情。這通常是在您完全不控制應用程序的情況下完成的。

如果非要使用文件頭的Cache-Control「最大年齡= 604800,公開」,將任何請求中的Cookie(曲奇),或響應cookie(設置Cookie)被轉移到其他用戶的計算機(自緩存)?或者只會爲個人用戶瀏覽而緩存?

請求cookie沒有被緩存,也不會被傳送到任何地方。響應(Set-Cookie緩存。由於您將cache-control指定爲公開,因此它將在所有客戶中共享。請注意,即使請求cookie不會直接緩存,如果你在渲染頁面的東西,這依賴於Cookie(例如,如果您使用服務器端的會話狀態,例如身份驗證cookie的),你將緩存個性化的反應。

如果設置是Cache-Control「max-age = 7200,proxy-revalidate」,那麼怎麼辦?再次感謝。

同樣的事情。 proxy-revalidate通知任何代理(如果有的話)他們可能不會服務陳舊的緩存。例如。一旦7200秒過去了,應立即清除緩存。如果沒有這個,緩存一般會繼續提供陳舊的緩存,然後在達到超時後在後臺獲取全新副本。或不 - 取決於代理。

+0

我確實希望將我的實際文件緩存在代理上,但不是單個用戶的Cookie。我該怎麼做呢? – Hope4You 2012-02-17 20:06:26

+0

非常感謝。我已經更新了我的問題。任何額外的幫助將是偉大的。 – Hope4You 2012-02-21 19:46:27

+0

你說'代理不會緩存對具有Cookie頭的請求的響應。問題是這樣的:當我請求諸如圖像和CSS之類的文件時,瀏覽器發送cookie(儘管它們對於渲染是不必要的 - 它只是瀏覽器的工作方式)。這是否意味着這些文件不會被緩存? – Hope4You 2012-02-21 20:54:45