Apache 短路模块是否重写条件

Apache 短路模块是否重写条件

这是我的问题

我的简单正则表达式工作得很好,我只是想确保正则表达式的第一部分短路以提高效率,我把我的问题放在了内联中

1-这个东西应该做的是,如果文件存在,则不应重写具有列出的扩展名的文件,如果文件不存在,我们将重写对我们的 php 文件的请求,所有其他文件类型始终被重写,无论文件是否存在。


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

例如:

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

  • 此语句的评估成本很高,我想确保我们在前一个 RewriteCond 上短路,并且只有当上述评估为真时才会检查其值。

  • 还需要知道操作系统或 apache 是否会缓存文件存在的结果(例如 php 会缓存 is_file() 结果)

例如:

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]

答案1

不,它会依次解析每种类型的每个重写规则。正则表达式可能会短路,也可能不会短路,具体取决于 libpcre,但每个 的RewriteRule输出都会输入到列表中的下一个规则中。来自文档:

重写规则将按照配置文件中定义的顺序应用于先前重写规则的结果。

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. 如果为真,则重写 URL。

相关内容