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

Cho*_*ang 49 apache .htaccess mod-rewrite

我正在努力学习一些.htaccess技巧.我遇到了RewriteBase指令,但无法让它正常工作.

我想知道这个指令具体是什么以及如何使用它.RewriteBase在StackOverflow和Apache文档中已经有过一些讨论但仍然无法得到我的问题的明确答案.

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

Jon*_*Lin 93

在一个htaccess文件,mod_rewrite的工作原理类似于<Directory><Location>容器.并且RewriteBase用于提供相对路径基础.

例如,假设您有此文件夹结构:

root
 |-- subdir1
 |-- subdir2
       |-- subsubdir
Run Code Online (Sandbox Code Playgroud)

所以你可以访问:

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

通过a发送的URI RewriteRule是相对于目录的.所以如果你有:

RewriteRule ^(.*)$ - 
Run Code Online (Sandbox Code Playgroud)

在根目录中,请求是/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]
Run Code Online (Sandbox Code Playgroud)

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

RewriteRule ^foo$ /bar.php [L]
Run Code Online (Sandbox Code Playgroud)

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

但另一个规则,相对路径,它基于规则所在的目录.所以如果

RewriteRule ^foo$ bar.php [L]
Run Code Online (Sandbox Code Playgroud)

是在"根",你去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]
Run Code Online (Sandbox Code Playgroud)

如果它是在"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]
Run Code Online (Sandbox Code Playgroud)

并且该规则在"subsubdir"中,http://example.com/subdir2/subsubdir/foo将实际上为我服务http://example.com/blah/bar.php."bar.php"被添加到基数的末尾.实际上,这个示例通常不是您想要的,因为您不能在同一目录容器或htaccess文件中有多个基础.

在大多数情况下,它使用如下:

RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
Run Code Online (Sandbox Code Playgroud)

这些规则将在"subdir1"目录中

RewriteBase /subdir2/subsubdir/
RewriteRule ^foo$ bar.php [L]
Run Code Online (Sandbox Code Playgroud)

将在"subsubdir"目录中.

这部分允许您使规则可移植,因此您可以将它们放在任何目录中,只需要更改基础而不是一堆规则.例如,如果你有:

RewriteEngine On
RewriteRule ^foo$ /subdir1/bar.php [L]
RewriteRule ^blah1$ /subdir1/blah.php?id=1 [L]
RewriteRule ^blah2$ /subdir1/blah2.php [L]
...
Run Code Online (Sandbox Code Playgroud)

将要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]
...
Run Code Online (Sandbox Code Playgroud)

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

RewriteBase /subdir2/subsubdir/
Run Code Online (Sandbox Code Playgroud)

就是这样.

  • @JonLin干得好!感谢您的详细回复,并且不仅仅是将我们发送到原始文档.原始文档显然很重要,但经常缺少针对该主题新手的明确教程.我现在对mod_rewrite规则有了更好的理解,可以毫不畏惧地颤抖地接近原始文档!:) (4认同)
  • %{REQUEST_URI}包含整个路径 (2认同)

Pac*_*ier 5

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

字面意思就是这样。(所以它的工作方式类似于 html basehref,⨕,但它很有用,因为通常在 URL 重写的上下文中不需要.默认的基 [ ] 。)

如果您有多个重写规则,Rewritebase 会使维护变得更加容易。事实上,如果您只使用一行 rewriterule,那么 rewritebase 几乎毫无用处(因为您可以简单地重写基于 url 的内容)。


边注

当然,您可以通过仅使用重写规则的绝对路径来 完全忽略 rewritebase 。


有关的