goo*_*eye 6 .htaccess url-rewriting
在许多重写规则的答案中,当测试某个条件的url时,我经常看到使用RewriteCond和REQUEST_URI以及RewriteRule本身的混合.
这只是个人偏好,还是有性能原因,或只是规则的清晰度?在我看来,所有这些都是有效的理由; 我只是想知道是否有特殊原因.
我知道RewriteCond是唯一的选择.我对RewriteRule也可以使用的情况感兴趣.通常这些是更简单的规则.
这里有些例子:
例1
这个答案有一个共同的模式,允许某些文件夹按原样. Htaccess维护模式允许某些目录
# 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]
Run Code Online (Sandbox Code Playgroud)
这可以通过RewriteRule来完成:
RewriteRule ^/(?:display_me_always|another_folder|even_more_folders) - [L]
Run Code Online (Sandbox Code Playgroud)
(添加了?:用于非捕获.我不确定是否有更简单的规则或不捕获更快.)
例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]
Run Code Online (Sandbox Code Playgroud)
这仅仅是规则似乎更简单.
RewriteRule ^/(?:display_me_always|another_folder|even_more_folders)/(.*)$ /other_location/$1 [R=301,NC]
Run Code Online (Sandbox Code Playgroud)
例3
此答案有一个共同的模式,如果尚未在目标位置重定向. Mod Rewrite规则将所有pdf请求重定向到另一个位置.使用RewriteCond测试文件夹,然后使用规则测试文件.
我可以看到负面情况与RewriteCond相比更清楚,但它仍然可以使用RewriteRule.
RewriteCond %{REQUEST_URI} !^/web_content/pdf/
RewriteRule ^(.+\.pdf)$ /web_content/pdf/$1 [L]
Run Code Online (Sandbox Code Playgroud)
这可以写成
RewriteRule ^(?!/web_content/pdf/)(.+\.pdf)$ /web_content/pdf/$1 [L]
Run Code Online (Sandbox Code Playgroud)
一个简单的原因是:对于非正则表达式专家来说,它更容易理解。
你今天要给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]
Run Code Online (Sandbox Code Playgroud)
提供
# always allow these folders
RewriteCond %{REQUEST_URI} ^/(display_me_always|another_folder|even_more_folders)
RewriteRule .+ - [L]
Run Code Online (Sandbox Code Playgroud)
你不可能在一两天内成为大师(除非,也许,你是某种天才)——一切都需要时间。你拥有的实践经验越多(通过自己修改这些规则),你就越有利于进一步发展,产生更高效/稳定的规则。
顺便说一句: 如果放在 .htaccess 中,此规则将不起作用(匹配模式中的 URL 不以斜杠开头):
RewriteRule ^/(?:display_me_always|another_folder|even_more_folders) - [L]
Run Code Online (Sandbox Code Playgroud)
但如果放置在服务器配置/虚拟主机上下文中,则可以正常工作——这是您需要了解的“细微差别”之一。
| 归档时间: |
|
| 查看次数: |
2314 次 |
| 最近记录: |