爲了優化緩存,我將時間戳添加到圖像的src值等,例如, <img src="/static/img/foo.1456871418309.png"/>.
AppEngine:將請求轉發到靜態內容
然後我創建了一個servlet過濾器,它再次刪除時間戳,然後將請求轉發給資源。 request.getRequestDispatcher (urlWithoutTimestamp).forward(request, response)
。
而在appengine-web.xml
我指定緩存一年的文件。
<static-files>
<include path="/static/**" expiration="365d" />
</static-files>
這樣,我想,用戶將隨時獲得最新的版本,直到有新版本出現可以緩存它,而不必通過HTTP進行測試。
在本地主機(運行作爲Web應用程序)能正常工作,HTTP響應所期待的緩存頭:
Cache-Control:"public, max-age=31536000"
Expires:"Wed, 01 Mar 2017 22:54:32 GMT"
然而,當我部署的應用程序引擎服務器對整個事情的反應有這個緩存頭(沒有「過期」):
Cache-Control:"private"
而是把請求轉發的,我也打過電話上HttpServletRequestWrapper
的FilterChain修改getRequestURI,getRequestURL,getServletPath。這導致了同樣的糟糕結果。
我該如何解決這個問題?
更新:
關於第二個想法,我想轉發到靜態內容是不可能的,因爲轉發總是做本地服務器和靜態內容很可能是另一臺機器上提供服務。
但至少我能夠解決我的HTTP標頭問題,我的過濾器:
- 相反轉發請求的,我使用了
HttpServletRequestWrapper
(見上文),以除去來自該請求的時間戳。 - 然後我調用chain.doFilter修改後的請求。
- 最後我在響應中設置了緩存標頭。
這聽起來很不錯!我會盡快嘗試:) (只是爲了更好的理解:它不是當前的時間戳,而是自服務器啓動以來第一次請求時設置爲最終靜態變量的最後一個 - 最好是編譯時的時間戳或部署時間,但不知道如何做到這一點。) – mbee
該值也將工作。你不需要它之間的請求uniq我猜,只是在不同版本的應用程序之間 –