Apache HTTP 2.2:当查询字符串版本存在时设置缓存标头

Apache HTTP 2.2:当查询字符串版本存在时设置缓存标头

我在整个网络上都找到了如何执行此操作的示例,但我无法使其发挥作用。

想要对查询字符串为 ?v=123 的请求设置较长的未来缓存时间。我已在下面提供了我的配置。但它就是不起作用。我做错了什么?

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

我已经尝试了正则表达式上的许多不同组合来测试查询字符串,但似乎没有任何效果。

答案1

事实证明,这个配置需要放在里面<VirtualHost>,这很麻烦,因为我试图从conf.d

不必要。

(知道这些指令位于主服务器配置中,在现有的 vHost 之外,这是您的问题中缺少的一个重要点。)

“问题”在于,<VirtualHost>默认情况下,容器不会继承服务器配置中的 mod_rewrite 指令。Header服务器配置中的指令(mod_headers 的一部分)处理,但由于 mod_rewrite 指令尚未运行且未设置LONGCACHE环境变量,因此未设置标头。

如果您使用的是 Apache 2.4,那么您可以使用SetEnvIfExpr(mod_setenvif)根据查询字符串的存在来设置环境变量,并避免使用 mod_rewrite。

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

RewriteEngine On
RewriteOptions Inherit

但请注意,服务器配置中的指令是继承的指令虚拟主机上下文(注意:<Directory>容器中的指令不适用,因为它们稍后运行 - 在目录上下文)。这意味着 vHost 中的指令可能会阻止服务器指令的执行。(在 Apache 2.4+ 上,您可以更好地控制指令的继承方式。)

或者,根据需要将这些“共享”指令包含在单独的配置文件中,并包含include在每个 vhost 中的配置文件中。

答案2

事实证明,此配置需要位于 内<VirtualHost>,这很麻烦,因为我试图从 conf.d 加载。但至少如果其他人遇到此问题,您需要将其放在 VirtualHost 中!

相关内容