这是我的问题
我的简单的正则expression式工作得很好,我只是想确保正则expression式的效率第一部分短路,我把我的问题在线
1-这个东西应该做的是,如果文件存在,那么带有列表扩展名的文件不应该被重写,如果文件不存在,我们重写请求到我们的PHP文件,所有其他文件types总是重写,不pipe文件是否存在。
例如:
RewriteCond %{REQUEST_FILENAME} \.(php|gif|jpg|png|ico|swf|flv|avi|mpg|jpeg|gz|ram)$
第二种情况,如果文件是我们的扩展之一,它是否存在于文件系统上?
对这个声明的评估是昂贵的,我想确保我们在以前的RewriteCond上短路,并且只有在上述评估为真的情况下才会检查这个值。
例如:
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ my_index.php?q=$1 [L,QSA]
例如:
RewriteRule \.(php|gif|jpg|png|ico|swf|flv|avi|mpg|jpeg|gz|ram)$ - [L] RewriteRule ^robots.txt$ - [L] RewriteRule ^(.*)$ my_index.php?q=$1 [L,QSA]
不,它会依次parsing每个types的重写规则。 正则expression式可能会短路或者不依赖于libpcre,但是每个RewriteRule的输出都被input列表中的下一条规则。 从文档:
重写规则应用于以前的重写规则的结果,按照它们在configuration文件中定义的顺序。
http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule
但是,一个或多个RewriteCond规则可能存在于RewriteRule之前,而这些规则实际上会短路。 所以,如果语句按照您拥有的顺序显示在文件中:
RewriteCond %{REQUEST_FILENAME} \.(php|gif|jpg|png|ico|swf|flv|avi|mpg|jpeg|gz|ram)$ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ my_index.php?q=$1 [L,QSA]
RewriteRule将不会被执行,所有的RewriteCond (特别是昂贵的)将不会被检查。 RewriteCond将被消除; 如果是错误的,同样的事情发生在上面。