之前错误的认为RewriteBase只会影响RewriteRule指令在匹配url时,是完全匹配还是不包含域名匹配。这种理解不正确,看个例子:
假如我们的服务器目录下有/a/b/目录,对于这个目录,我们使用了Alias指令
Alias /a /root/b
// 即我们访问www.server-name.com/a/index.html会返回/root/b/index.html
这时, 如果我们访问www.server-name.com/a/old.html,且在/root/b下有.htaccess文件,内容如下:
RewriteEngien On
RewriteBase /a
RewriteRule ^old\.html$ new.html
会发生什么?
分析一下:
- 因为Alias指令的存在,所以:/a/old.html => /root/b/old.html
- 因为 b目录下有.htaccess文件,所以:/root/b/old.html => /root/b/new.html
- 这里就体现RewriteBase的功能了,因为设置成/a,所以:/root/b/new.html => /a/new.html。
- 最后,因为Alias指令,/a/new.html => /root/b/new.html
关于第三点,回到刚开始我错误的理解,就是RewriteRule在匹配url时,是怎么匹配的?我的理解是以.htaccess文件所在目录为基准的,举个例子:假如.htaccess文件在/a/b/c目录下,那么当我们访问www.sn.com/a/b/c/d/old.html,那么是从/d开始匹配的,即匹配/b/old.html。
所以RewriteBase是目录级重写的基准,即当我们用RewriteRule不是重定向或者代理时,如何寻找新的目录或文件。