RewriteBase做什么以及如何使用它?

我正在尝试学习一些.htaccess技巧。 我遇到了RewriteBase指令,但无法正常工作。

我想知道这个指令具体是什么,以及如何使用它。 关于StackOverflow中的RewriteBaseApache文档已经有了一些讨论,但是我仍然无法明确地回答我的问题。

有人能告诉我一个简单但有效的例子, RewriteBase可以使用吗?

在htaccess文件中,mod_rewrite与<Directory><Location>容器类似。 而RewriteBase则用来提供相对路径的基础。

例如,假设你有这个文件夹结构:

 root |-- subdir1 |-- subdir2 |-- subsubdir 

所以你可以访问:

  • http://example.com/ (根)
  • http://example.com/subdir1
  • http://example.com/subdir2
  • http://example.com/subdir2/subsubdir

通过RewriteRule发送的URI与目录相关。 所以如果你有:

 RewriteRule ^(.*)$ - 

在根中,请求是/a/b/c/d ,那么捕获的URI( $1 )是a/b/c/d 。 但是,如果规则在subdir2 ,并且请求是/subdir2/e/f/g那么捕获的URI是e/f/g 。 如果规则在subsubdir ,并且请求是/subdir2/subsubdir/x/y/z ,则捕获的URI是x/y/z 。 规则所在的目录将该部分从URI中删除。 重写基地对此没有影响,这只是每个目录的工作原理。

重写基地所做的是为规则目标中的任何相对路径提供URL路径基础( 而不是文件路径基础)。 所以说你有这个规则:

 RewriteRule ^foo$ bar.php [L] 

bar.php是一个相对路径,而不是:

 RewriteRule ^foo$ /bar.php [L] 

/bar.php是绝对路径。 绝对路径将始终是“根”(在上面的目录结构中)。 这意味着如果规则在“根”,“subdir1”,“subsubdir”等/bar.php路径总是映射到http://example.com/bar.php

但是另一个规则是相对路径,它是基于规则所在的目录

 RewriteRule ^foo$ bar.php [L] 

是在“根”,你去http://example.com/foo ,你得到服务http://example.com/bar.php 。 但是,如果该规则位于“subdir1”目录中,并且转到http://example.com/subdir1/foo ,则会获得服务http://example.com/subdir1/bar.php 。 等等。这个文件有时候可以起作用,有时不起作用,但是大多数情况下,它似乎都是有效的。 除了你正在重定向(使用R标志,或隐式,因为你的规则的目标中有http://host )。 这意味着这个规则:

 RewriteRule ^foo$ bar.php [L,R] 

如果它位于“subdir2”目录中,并且转到http://example.com/subdir2/foo ,则mod_rewrite会将相对路径误认为文件路径而不是URL路径,并且由于R标志,最终会被重定向到http://example.com/var/www/localhost/htdocs/subdir1 。 这显然不是你想要的。

这是RewriteBase进来的地方。该指令告诉mod_rewrite要追加到每个相对路径的开头。 所以如果我有:

 RewriteBase /blah/ RewriteRule ^foo$ bar.php [L] 

而该规则是在“subsubdir”,去http://example.com/subdir2/subsubdir/foo实际上会服务于我http://example.com/blah/bar.php 。 “bar.php”被添加到底部的末尾。 在实践中,这个例子通常不是你想要的,因为你不能在同一个目录容器或htaccess文件中有多个基地。

在大多数情况下,它是这样使用的:

 RewriteBase /subdir1/ RewriteRule ^foo$ bar.php [L] 

那些规则将在“subdir1”目录中

 RewriteBase /subdir2/subsubdir/ RewriteRule ^foo$ bar.php [L] 

将在“subsubdir”目录中。

这部分地允许你使你的规则可移植,所以你可以把它们放在任何目录中,只需要改变基础而不是一堆规则。 例如,如果你有:

 RewriteEngine On RewriteRule ^foo$ /subdir1/bar.php [L] RewriteRule ^blah1$ /subdir1/blah.php?id=1 [L] RewriteRule ^blah2$ /subdir1/blah2.php [L] ... 

这样http://example.com/subdir1/foo将会提供http://example.com/subdir1/bar.php等。然后说你决定把所有这些文件和规则移动到“subsubdir”目录。 而不是更改/subdir1/ to /subdir2/subsubdir/每个实例,您可能只有一个基础:

 RewriteEngine On RewriteBase /subdir1/ RewriteRule ^foo$ bar.php [L] RewriteRule ^blah1$ blah.php?id=1 [L] RewriteRule ^blah2$ blah2.php [L] ... 

然后,当您需要将这些文件和规则移动到另一个目录时,只需更改基础:

 RewriteBase /subdir2/subsubdir/ 

就是这样。

1行答案是: Rewritebase设置rewriterule arg2的基本路径

这就是字面意思。 (所以它的工作原理就像html basehref, &pointint;除了在URL的上下文中经常使用它,重写默认的base [ . ]是不需要的 )。

如果你有多个重写过程,Rewritebase使得维护更容易。 事实上,如果你只使用一行重写代码,那么rewritebase几乎是无用的(因为你可以简单地重写基础url)。


边注

当然,你可以完全忽略rewritebase,只使用绝对路径进行重写。


有关

  • 一个重写库不符合[巧合]使用