使用Apache mod_rewrite为不同的redirect设置不同的caching标头

我有一个Apache虚拟主机,执行一些重写操作(使用mod_rewrite)所请求的url。 其中一些RewriteRule调用将浏览器redirect到其他主机(使用301和302redirect)。

我已经在该虚拟主机文件中设置了1秒的默认期限:

ExpiresActive On ExpiresDefault "access plus 1 second" 

因此,所有的redirect都包含这个标题:

 Cache-Control: max-age=1 

现在我想要做的是在一个特定的redirect的情况下输出一个不同的caching头。 我希望大部分的redirect(302s)会持续1秒到期,但是其中一个(301),我想用1天的到期。

这是可行的吗?

有一种方法可以做到这一点,但不是与mod_expires。 相反,您必须使用mod_rewrite设置一个环境variables,然后有条件地将正确的caching标头添加到mod_headers,如http://mark.koli.ch/2010/12/set-cache-control-and-expires-headers-on- a-redirect-with-mod-rewrite.html 。

所以我最终的解决scheme是这样的:

 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设置的默认过期期限,否则您将以重复标题结束。

扩展@Francois Marier的答案,我需要一个没有30Xredirect的重写规则:

 RewriteRule ^version/[0-9a-z\-]*/(.*)$ /foo/$1 [E=versioncache:1] 

而且因为我想在Header set规则中使用versioncache ,它需要是:

 Header always set Cache-Control "max-age=86400" env=REWRITE_versioncache 

多长时间,你认为我找出为什么明显... env=versioncache不起作用? 感谢这个答案的提示在Apache预先REWRITE_

为此,您需要制作另一个具有不同设置的虚拟主机,而在“这种情况”下需要redirect时,请使用vHost。 这不是PHP代码,它是Apache语言。 抱歉。 没有if-thens。

你可以尝试使用Apache mod_setenvif SetEnvIf指令。 像这样(未testing):

 SetEnvIf Request_URI \.gif EXPIRES1DAY Header set Cache-Control max-age=86400 env=EXPIRES1DAY 

解决此问题的一种方法是不删除mod_expires设置的默认失效期限,即为要redirect的URL添加<Location>块。 假设您正在redirect到一个版本化的文件夹,您将定期更改该版本:

 RewriteRule ^/approot/(.*) /approot.1.2.3.4/$1 [R=307,L] 

如果您不希望redirect被caching(但您确实需要caching实际内容),只需将此块添加到您的configuration中:

 <Location /approot> ExpiresActive Off </Location> 

当然,“ /approot ”代表你正在redirect的任何URL。

简单和容易。 你不必摆弄你已经工作的mod_expiresconfiguration。 您不必尝试使用mod_headers添加或删除标题。 您只要告诉mod_expires不要为您redirect的url添加标头。

我首先尝试了上面所接受的答案(由Francois Marier提供),但是它不起作用,因为我不想禁用我的ExpiresDefault设置,然后必须在configuration的许多不同区域中复制到期。