我在整个网络上都找到了如何执行此操作的示例,但我无法使其发挥作用。
想要对查询字符串为 ?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 中!