在许多重写规则的答案中,当测试某个条件的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]
答案 0 :(得分:2)
一个简单的原因:对于非正则表达的大师来说,它更容易理解。
你今天将给予OP的重写规则,他可能需要在一天之后修改..并且规则越容易理解他将更多地自己调查并且不再跑到这个地方的机会又一个小修复/新类似规则。
是的,合并规则更快 - 这里毫无疑问。但是,与单个脚本执行相比,URL重写所花费的时间仍然很少......它只能在CPU非常繁忙的服务器上以及有很多这样的重写时发挥作用。
因此,最优化将介于两者之间 - 这仍然易于阅读,同时又紧凑而高效。而不是
# 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]
提供
# always allow these folders
RewriteCond %{REQUEST_URI} ^/(display_me_always|another_folder|even_more_folders)
RewriteRule .+ - [L]
你不可能在一两天内成为一名大师(除非,也许,你是某种天才) - 一切都需要时间。您拥有的实践体验越多(通过自己修改这些规则),您就越有可能进一步行动,以产生更有效/稳定的规则。
<强>顺便说一句:强> 如果置于.htaccess中,则此规则将不起作用(匹配模式中的URL以无前导斜杠开头):
RewriteRule ^/(?:display_me_always|another_folder|even_more_folders) - [L]
但如果置于服务器配置/虚拟主机环境中,它将正常工作 - 这是您需要了解的“细微差别”之一。
答案 1 :(得分:0)
一般来说,我说你是对的:RewriteCond
主要用于匹配除REQUEST_URI以外的项目。我希望大多数案例都是在.htaccess中查看案例。来自spec:
如果您希望匹配每个目录(htaccess)RewriteRule中的完整URL路径,请使用RewriteCond中的%{REQUEST_URI}变量。