mod_rewrite:揭开RewriteBase的神秘面纱(一劳永逸)

时间:2014-02-15 13:04:35

标签: php wordpress apache .htaccess mod-rewrite

我一直在看这个(为了整洁,我省略了IfModuleRewriteEngine指令):

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的一部分之间是否存在冗余?

1 个答案:

答案 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行的存在。