apache短路mod重写条件

这是我的问题

我的简单的正则expression式工作得很好,我只是想确保正则expression式的效率第一部分短路,我把我的问题在线

1-这个东西应该做的是,如果文件存在,那么带有列表扩展名的文件不应该被重写,如果文件不存在,我们重写请求到我们的PHP文件,所有其他文件types总是重写,不pipe文件是否存在。


  • 第一个条件,该文件是否有以下任何扩展名?

例如:

RewriteCond %{REQUEST_FILENAME} \.(php|gif|jpg|png|ico|swf|flv|avi|mpg|jpeg|gz|ram)$ 
  • 第二种情况,如果文件是我们的扩展之一,它是否存在于文件系统上?

  • 对这个声明的评估是昂贵的,我想确保我们在以前的RewriteCond上短路,并且只有在上述评估为真的情况下才会检查这个值。

  • 还需要知道如果操作系统或Apache将caching文件的存在的结果(例如PHP的cachingis_file()的结果)

例如:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ my_index.php?q=$1 [L,QSA] 
  • 目录和文件独自一人….因为如果他们通过
  • 文件存在testing,他们不应该被重写

例如:

 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] 
  1. 扩展将被检查; 如果它不在列表中,则下一个RewriteRule将不会被执行,所有的RewriteCond (特别是昂贵的)将不会被检查。
  2. 否则,昂贵的文件系统RewriteCond将被消除; 如果是错误的,同样的事情发生在上面。
  3. 如果为true,则URL被重写。