在对一个新的URL进行替换时,此模块必须把这个URL重新注入到服务器处理中。为此,它必须知道其对应的URL前缀或者说URL基准。通常,此前缀就是对应的文件路径。但是,大多数网站URL不是直接对应于其物理文件路径的,因而一般不能做这样的假定!所以在这种情况下,就必须用RewriteBase指令来指定正确的URL前缀。
如果你的网站服务器URL不是与物理文件路径直接对应的,而又需要使用RewriteBase指令,则必须在每个对应的.htaccess文件中指定RewriteRule。
例如,目录级配置文件内容如下:
/abc/def/.htaccess--/abc/def目录的配置文件
注意:/abc/def是/xyz的物理路径(例如存在一条'Alias/xyz/abc/def'指令)。
RewriteEngineOn
让服务器知道我们使用的是/xyz而不是物理路径/abc/def
RewriteBase/xyz
重写规则
RewriteRule^oldstuff.html$newstuff.html
注:上述例子中,对/xyz/oldstuff.html的请求被正确地重写为对物理文件/abc/def/newstuff.html的请求。
以下列出了内部处理的详细步骤:
请求:
/xyz/oldstuff.html
内部处理过程:
/xyz/oldstuff.html->/abc/def/oldstuff.html(per-serverAlias)
/abc/def/oldstuff.html->/abc/def/newstuff.html(per-dirRewriteRule)
/abc/def/newstuff.html->/xyz/newstuff.html(per-dirRewriteBase)
/xyz/newstuff.html->/abc/def/newstuff.html(per-serverAlias)
结果:
/abc/def/newstuff.html
虽然这个过程看来很繁复,但是由于目录级重写的到来时机已经太晚了,它不得不把这个(重写)请求重新注入到Apache核心中,所以Apache内部确实是这样处理的。但是:它的开销并不象看起来的那样大,因为重新注入完全在Apache服务器内部进行,而且这样的过程在Apache内部也为其他许多操作所使用。所以,你可以充分信任其设计和实现是正确的。