我有一个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的许多不同区域中复制到期。