我一直在看这个(为了整洁,我省略了IfModule
和RewriteEngine
指令):
RewriteBase /somedir/ #1
RewriteRule ^index\.php$ - [L] #2
RewriteCond %{REQUEST_FILENAME} !-f #3
RewriteCond %{REQUEST_FILENAME} !-d #4
RewriteRule . /somedir/index.php [L] #5
从documentation(和我的经验):
在.htaccess文件中使用重写引擎时,每个目录 对于RewriteRule模式,会自动删除前缀[...] 匹配并在任何 相对之后自动添加(不启动 使用斜杠或协议名称)替换遇到a的结尾 规则集。有关的更多信息,请参阅RewriteBase指令 将哪些前缀添加回 相对替换。
现在,上方的第5行不 相对替换(请注意前导斜杠),因此第1行无效,因为没有为“绝对的“替代。” 那么我的问题是,指令#1和#5的一部分之间是否存在冗余?
答案 0 :(得分:2)
然后我的问题是,指令#1和#5的一部分之间是否存在冗余?
不,它实际上不是冗余。这只是因为你在这里使用绝对URL告诉mod_rewrite
引擎在重写中使用绝对URL而不是相对的URL。
如果您的第5行变为:
RewriteRule . index.php [L]
然后RewriteBase
将生效,并将用于将URI重写为:/somedir/index.php
使用RewriteBase
的主要优势是您不需要在同一/somedir/
文件中出现的所有规则中重复.htaccess
。
如何动态获取RewriteBase
:
RewriteCond %{REQUEST_URI}::$1 ^(.*?/)(.*)::\2$
RewriteRule ^(.*)$ - [E=BASE:%1]
关于WP:
Wordpress可以安全地从RewriteRule中删除绝对路径,因为它们无论如何都使用绝对路径。但事实是,许多WP插件都覆盖了.htaccess文件,所以他们只是不想依赖RewriteBase行的存在。