2010-10-27 78 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