Apache-2.2

Apache HTTP 2.2:當查詢字元串版本存在時設置記憶體頭

  • February 18, 2019

我在網上找到瞭如何做到這一點的例子,但我無法讓它發揮作用。

想要為具有類似 ?v=123 的查詢字元串的請求設置較長的未來記憶體時間。我在下麵包含了我的配置。但它只是行不通。我究竟做錯了什麼?

RewriteEngine on
RewriteCond %{QUERY_STRING} ^v
RewriteRule ^.*$ - [ENV=LONGCACHE:1]
Header set Cache-Control "max-age=31536000, public" env=LONGCACHE

我在測試查詢字元串的正則表達式上嘗試了一堆不同的組合,似乎沒有任何效果。

原來這個配置需要在裡面<VirtualHost>,這很痛苦,因為我試圖從conf.d

不必要。

(知道這些指令位於現有 vHost 之外的主伺服器配置中,這是您的問題中缺少的重要一點。)

“問題”是伺服器配置中的 mod_rewrite 指令<VirtualHost>預設情況下不被容器繼承。處理伺服器配置中Header指令(mod_headers 的一部分),但由於 mod_rewrite 指令尚未執行且未設置環境變數,因此未設置標頭。LONGCACHE

如果您使用的是 Apache 2.4,那麼您可以使用SetEnvIfExpr(mod_setenvif) 根據查詢字元串的存在來設置環境變數,並避免使用 mod_rewrite。

在 Apache 2.2 上,您需要在<VirtualHost>容器中啟用 mod_rewrite 繼承:

RewriteEngine On
RewriteOptions Inherit

但是請注意,來自伺服器配置的指令是在虛擬主機上下文中的指令**之後繼承的(注意:容器中的指令不適用,因為它們稍後執行 - 在目錄上下文中)。這意味著 vHost 中的指令可能會阻止伺服器指令被執行。(在 Apache 2.4+ 上,您可以更好地控制指令的繼承方式。)<Directory>

或者,根據需要將這些“共享”指令包含在單獨的配置文件和include每個虛擬主機中的配置文件中。

引用自:https://serverfault.com/questions/954228