Apache – RewriteBase指令的错误理解

之前错误的认为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

会发生什么?

分析一下:

  1. 因为Alias指令的存在,所以:/a/old.html  =>  /root/b/old.html
  2. 因为 b目录下有.htaccess文件,所以:/root/b/old.html  =>  /root/b/new.html
  3. 这里就体现RewriteBase的功能了,因为设置成/a,所以:/root/b/new.html  =>  /a/new.html。
  4. 最后,因为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不是重定向或者代理时,如何寻找新的目录或文件。

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注