这是我的问题
我的简单正则表达式工作得很好,我只是想确保正则表达式的第一部分短路以提高效率,我把我的问题放在了内联中
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]
- 将检查扩展;如果它不在该列表中,
RewriteRule
则不会执行下一个,并且RewriteCond
不会检查它之前的所有扩展(特别是昂贵的扩展)。 - 否则,将评估昂贵的文件系统
RewriteCond
;如果为假,则会发生与上述相同的事情。 - 如果为真,则重写 URL。