2013-08-19 39 views
2

我有一个可下载的文件,其中包含版本号的文件名,比如说download-3-0.dat将是当前版本号。避免递归循环的重定向模式文件

我想重定向到文件的以前版本的当前的外部引用,以便下载2-5.dat会重定向到下载,3-0.dat

这似乎是一个部分解决方案:

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

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

但问题是你如何添加一个例外,以目前的版本,所以它不进入一个递归循环(最后一个重写规则会重定向到itsef如果请求的文件下载3-0.dat)

回答

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:既然我们不能对RewriteCond作为反向参考RHS使用%变量,我使用特殊的正则表达式反向引用变量\1在这里RewriteCond

+0

这个确实有用,谢谢。由于真正的实现涉及更多的变体,我假装定义CURRENT变量一次。用你的方法,在更改版本时,我必须在.htaccess文件的几个位置修改它(可能的错误类型错误)。在使用您的解决方案之前,我会在这个方向上等待一些建议或启发。谢谢! – Joan

+1

是的,las的解决方案非常完美,非常感谢。 (我几乎明白了!! :-) – Joan

+0

不客气,很高兴它为你解决。 – anubhava

1

我认为你只需要一个RewriteCond即co nfirms它不是当前版本:

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模式,但这应该让你在正确的方向前进。

+2

['RewriteCond'](http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond)的'CondPattern'部分不能包含环境变量,它必须是perl兼容的正则表达式,或一个字符串。另外环境变量可以使用花括号来访问。 – ndm

+0

是的,正如ndm所说,变量替换不是在CondPattern中完成的。 – Joan