.htaccess 避免递归循环的重定向模式文件

.htaccess 避免递归循环的重定向模式文件,.htaccess,redirect,recursion,.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,将是当前的一个

我想将文件先前版本的外部引用重定向到当前版本,以便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,则上一次重写规则将重定向到itsef。dat

我认为您只需要一次重写,以确认它不是当前版本:

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中调整模式,但这应该会让您朝着正确的方向前进。

我认为您只需要一个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]

您可能需要在“重写”状态下调整模式,但这将使您朝着正确的方向前进。

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

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上的%variables作为后向引用,因此我在这里的RewriteCond中使用了特殊的regex后向引用变量\1。

您可以用此行替换所有代码:

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上使用%variables作为后向引用,所以我在这里的RewriteCond中使用特殊的regex后向引用变量\1。

的CondPattern部分不能包含环境变量,它必须是与perl兼容的正则表达式或字符串。也可以使用大括号访问环境变量。是的,正如ndm所说,变量替换不是在CondPattern中完成的。的CondPattern部分不能包含环境变量,它必须是与perl兼容的正则表达式或字符串。此外,环境变量也可以使用大括号访问。是的,正如ndm所说,变量替换不是在CondPattern中完成的。这一个确实有效,谢谢。由于实际的实现涉及更多的变体,我假装只定义了一次当前变量。使用您的方法,在更改版本时,我必须在.htaccess文件中的多个位置对其进行修改,这可能会导致键入错误。在使用您的解决方案之前,我将等待在这方面的一些建议或灵感。谢谢是的,las解决方案非常完美,非常感谢。我几乎明白了!!:-这个确实有效,谢谢。由于实际的实现涉及更多的变体,我假装只定义了一次当前变量。使用您的方法,在更改版本时,我必须在.htaccess文件中的多个位置对其进行修改,这可能会导致键入错误。在使用您的解决方案之前,我将等待在这方面的一些建议或灵感。谢谢是的,las解决方案非常完美,非常感谢。我几乎明白了!!:-