2013-08-19 35 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