2010-10-27 77 views
1

我在我的RewriteRule中有一個正則表達式,它目前工作正常。其次,我想測試一下文件(請求被重寫的地方)是否存在。因此,我在我的規則之前放置了一個RewriteCond,但不幸的是,它始終驗證爲false。RewriteCond始終驗證爲false

這是我的正則表達式:

assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4}) 

我創造了這個的.htaccess:

RewriteCond assets/img$1/.$2.$4/$3.$4 -s 
RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ assets/img$1/.$2.$4/$3.$4 [NC,L,QSA] 
RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ assets/img/image.php?path=$1&file=$2.$4&key=$3&ext=$4 [NC,L,QSA] 

沒有的RewriteCond,其中改寫位置存在的請求,工作正常。對於那些誰感興趣的話,我的完整的.htaccess被張貼在這裏:http://pastie.org/1293667

回答

1

的問題是,一個RewriteCond只適用於緊隨其後的規則,那麼你的第二個RewriteRule始終運行。一個解決方案is to negate the test you are making, then have the next command skip the two commands you want to run

RewriteCond %{DOCUMENT_ROOT}assets/img$1/.$2.$4/$3.$4 !-f 
RewriteRule . - [S=2] 
RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ assets/img$1/.$2.$4/$3.$4 [NC,QSA] 
RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.([^/]+)\.([a-z]{2,4})$ assets/img/image.php?path=$1&file=$2.$4&key=$3 [NC,L,QSA] 
+1

假設我正確理解他的意圖,向Jurian的第一個RewriteRule添加一個跳過標誌(跳過1條規則)應該就足夠了。 – outis 2010-10-27 13:04:46

+0

感謝您的回答,這真的很有幫助!不幸的是,我注意到現在第一條規則(重寫到圖像的另一個位置)完全不起作用(例如,當條件和第二條規則被刪除時)。儘管如此,直接請求(請參閱問題)仍然正常工作。有比錯誤標誌更多的錯誤嗎? – 2010-10-27 14:13:32

+0

好的,我發現你的規則不起作用。我使用了mod_vhost_alias,因此DOCUMENT_ROOT不會更改爲正確的值。有關於此的一個錯誤:https://issues.apache.org/bugzilla/show_bug.cgi?id=26052。無論如何,你的答案最終是正確的。 – 2010-12-22 11:37:51