使用 Apache mod_rewrite 为不同的重定向设置不同的缓存标头

使用 Apache mod_rewrite 为不同的重定向设置不同的缓存标头

我有一个 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]

因为我想versioncacheHeader 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设置,然后必须在其位置的配置的许多不同区域中复制到期时间。

相关内容