我有一个 Apache vhost,它对请求的 URL 执行大量重写操作(使用 mod_rewrite)。其中一些 RewriteRule 调用将浏览器重定向到其他主机(使用 301 和 302 重定向)。
我在该 vhost 文件中设置了 1 秒的默认到期时间:
ExpiresActive On
ExpiresDefault "access plus 1 second"
因此,所有重定向都包含此标头:
Cache-Control: max-age=1
现在我想做的是针对某个特定重定向输出不同的缓存标头。我希望大多数重定向 (302) 继续使用 1 秒的有效期,但对于其中一个 (301),我想使用 1 天的有效期。
这可行吗?
答案1
有一种方法可以做到这一点,但不是通过 mod_expires。相反,您必须使用 mod_rewrite 设置环境变量,然后有条件地使用 mod_headers 添加正确的缓存标头,如中所述Mark S. Kolich:使用 mod_rewrite 在重定向时设置 Cache-Control 和 Expires 标头。
所以我的最终解决方案是这样的:
RewriteRule ... [last,redirect=301,env=longexpiry:1]
RewriteRule ... [last,redirect=302,env=nocache:1]
Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache
Header always set Cache-Control "max-age=86400" env=longexpiry
确保您没有通过 mod_expires 设置默认到期时间,否则您将得到重复的标题。
答案2
扩展@Francois Marier 的答案,我需要一个如下所示但没有 30X 重定向的重写规则:
RewriteRule ^version/[0-9a-z\-]*/(.*)$ /foo/$1 [E=versioncache:1]
因为我想versioncache
在Header set
规则中使用,所以它需要:
Header always set Cache-Control "max-age=86400" env=REWRITE_versioncache
你认为我需要多长时间才能弄清楚为什么显而易见的事情... env=versioncache
没有奏效?感谢这个答案有关 apache 前置的提示REWRITE_
。
答案3
为此,您需要创建另一个具有不同设置的虚拟主机,对于“这种情况”下所需的重定向,请使用该 vHost。这不是 PHP 代码,而是 Apache 语言。抱歉。没有 if-then。
答案4
解决此问题而不删除 mod_expires 设置的默认过期时间的一种方法是<Location>
为要重定向的 URL 添加一个块。假设您要重定向到版本控制文件夹,并且您将定期更改该版本:
RewriteRule ^/approot/(.*) /approot.1.2.3.4/$1 [R=307,L]
如果您不希望缓存该重定向(但希望缓存实际内容),只需将此块添加到您的配置中:
<Location /approot>
ExpiresActive Off
</Location>
当然,“ /approot
”代表您要重定向的任何 URL。
简单易用。您不必摆弄已经正常工作的 mod_expires 配置。您不必尝试使用 mod_headers 添加或删除标头。您只需告诉 mod_expires 不要为您正在重定向的 URL 添加其标头。
我首先尝试了上面接受的答案(由 Francois Marier 提出),但是它没有起作用,因为我不想禁用我的ExpiresDefault
设置,然后必须在其位置的配置的许多不同区域中复制到期时间。