【发布时间】:2011-11-08 20:33:16
【问题描述】:
在许多重写规则答案中,在针对特定条件测试 url 时,我经常看到将 RewriteCond 与 REQUEST_URI 以及 RewriteRule 本身混合使用。
这只是个人喜好,还是有性能原因,或者只是规则的明确性?在我看来,所有这些都是正当的理由;我只是想知道是否有特殊原因。
我知道在某些情况下 RewriteCond 是唯一的选择。我对 RewriteRule 也可以工作的情况感兴趣。通常这些是更简单的规则。
这里有一些例子:
示例 1
这个答案有一个共同的模式,允许某些文件夹按原样。 Htaccess maintenance mode allow certain directories
# always allow these folders
RewriteCond %{REQUEST_URI} ^/display_me_always [OR]
RewriteCond %{REQUEST_URI} ^/another_folder [OR]
RewriteCond %{REQUEST_URI} ^/even_more_folders
RewriteRule .+ - [L]
这可以通过一个 RewriteRule 来完成:
RewriteRule ^/(?:display_me_always|another_folder|even_more_folders) - [L]
(添加了 ?: 用于非捕获。我不太确定是否有更简单的规则会更快,还是不捕获。)
示例 2
为更常见的情况修改此设置,将某些文件夹重定向到其他文件夹。
RewriteCond %{REQUEST_URI} ^/display_me_always [OR]
RewriteCond %{REQUEST_URI} ^/another_folder [OR]
RewriteCond %{REQUEST_URI} ^/even_more_folders
RewriteRule ^/[^/]+/(.*)$ /other_location/$1 [L]
仅使用规则似乎更简单。
RewriteRule ^/(?:display_me_always|another_folder|even_more_folders)/(.*)$ /other_location/$1 [R=301,NC]
示例 3
这个答案有一个共同的模式,如果还没有在目标位置重定向。 Mod Rewrite rule to redirect all pdf request to another location。使用 RewriteCond 测试文件夹,然后使用规则测试文件。
我可以看到与 RewriteCond 相关的负面条件要清楚得多,但使用 RewriteRule 仍然可能。
RewriteCond %{REQUEST_URI} !^/web_content/pdf/
RewriteRule ^(.+\.pdf)$ /web_content/pdf/$1 [L]
这可以写成
RewriteRule ^(?!/web_content/pdf/)(.+\.pdf)$ /web_content/pdf/$1 [L]
【问题讨论】: