重定向模式文件,避免递归循环

时间:2013-08-19 11:08:58

标签: .htaccess redirect recursion

我有一个可下载的文件,其文件名包含版本号,比如说download-3-0.dat就是当前版本。

我想将外部引用重定向到当前版本的文件,因此download-2-5.dat会重定向到download-3-0.dat

这似乎是部分解决方案:

RewriteRule .* - [E=CURRENT:3-0]

RewriteRule ^download(.*).dat$ http://site.com/download-%[ENV:CURRENT].dat [L, R=301]

但问题是如何在当前版本中添加一个异常,因此它不会进入递归循环(如果请求的文件是download-3-0.dat,则最后一次重写规则将重定向到itsef)

2 个答案:

答案 0 :(得分:3)

您可以使用以下代码替换所有代码:

RewriteRule ^download-(?!3-0\.dat$) /download-3-0.dat [L,R=301,NC]

编辑:根据您的评论如下: -

嗯,事实证明这比我在开始时的预期更棘手。

试试这段代码:

# set your current version here
SetEnvIf Request_URI "^" CURRENT=3-0

RewriteCond %{ENV:CURRENT}:%{REQUEST_URI} !^([^:]+):/download-\1\.dat$ [NC]
RewriteRule ^download-[^.]+\.dat$ /download-%{ENV:CURRENT}.dat [L,R=301,NC]

PS:由于我们无法在%的RHS上使用RewriteCond变量作为反向引用,因此我使用了特殊的正则表达式反向引用变量\1这里是RewriteCond

答案 1 :(得分:1)

我认为您只需要一个RewriteCond来确认它不是当前版本:

RewriteRule .* - [E=CURRENT:3-0]

RewriteCond %{REQUEST_URI} !^download-3-0.dat
RewriteRule ^download(.*).dat$ http://site.com/download-%{ENV:CURRENT}.dat [L, R=301]

您可能需要在RewriteCond中调整模式,但这应该让您朝着正确的方向前进。