在 Apache 代理程式中快取查詢字串

在 Apache 代理程式中快取查詢字串

我在使 disk_cache 工作時遇到問題,但我不明白為什麼。這是我的配置中的相關部分

# Caching
CacheRoot   "/var/cache/apache2/"
CacheEnable disk /

我正在對如下請求進行計時,但快取似乎沒有生效,因為無論如何回應都使用了 7 秒。

time curl -k https://customer1.myhosts.com/appserver/slow_request?param1=fooBar

啟用偵錯日誌記錄後,我在日誌中發現了以下語句,解釋了為什麼沒有進行快取:

[2012 年 8 月 24 日星期五 17:22:01] [調試] mod_cache.c(552):快取:未快取。原因:存在查詢字串但沒有明確的過期時間

事實證明,Apache 快取指南中提到了這一點:

如果URL 包含查詢字串(例如,來自HTML 表單GET 方法),則不會對其進行緩存,除非回應透過包含「Expires:」標頭或「Cache」的max-age 或s-maxage 指令來指定顯式過期時間。

好的,所以我添加以下內容(摘自本文)在阿帕契

Header set Cache-Control "max-age=290304000"

還是不行,這次收到訊息了

“...未快取。原因:沒有 Last-Modified、Etag 或 Expires 標頭”

現在,這是一個不同的故事。如何在不觸及應用程式伺服器程式碼的情況下解決這個問題?

答案1

我可以讓 Apache 快取來自應用程式伺服器的回應的唯一方法是將 Apache 在日誌中要求的標頭添加到回應中。事實證明,創建 JAX-RS 過濾器非常簡單。

因此,在新增 Last-Modified 和 Expires 標頭之後,唯一需要的是我的 apache 配置中的以下兩行。

CacheRoot   "/var/cache/apache2/"
CacheEnable disk / 

答案2

如同

強制 Apache 2.4 使用 mod_cache 快取帶有查詢字串的檔案而不過期

Cache-Control:s-maxage=1200 

解決了這個問題

相關內容