Apache RewriteBase做什么以及如何使用它?
我正在尝试学习一些Apache RewriteBase做什么以及如何使用它?,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我正在尝试学习一些.htaccess技巧。我遇到了RewriteBase指令,但无法使其正常工作 我想知道这个指令具体做什么以及如何使用它。关于StackOverflow和Apache文档中的RewriteBase,已经进行了一些讨论,但我仍然无法对我的问题得到明确的答案 有人能给我举一个简单但有效的例子,说明可以使用RewriteBase吗?在htaccess文件中,mod_rewrite的工作原理类似于或容器。和用于提供相对路径基础的 例如,假设您有以下文件夹结构: root |-- su
.htaccess
技巧。我遇到了RewriteBase
指令,但无法使其正常工作
我想知道这个指令具体做什么以及如何使用它。关于StackOverflow和Apache文档中的RewriteBase
,已经进行了一些讨论,但我仍然无法对我的问题得到明确的答案
有人能给我举一个简单但有效的例子,说明可以使用
RewriteBase
吗?在htaccess文件中,mod_rewrite的工作原理类似于
或
容器。和用于提供相对路径基础的
例如,假设您有以下文件夹结构:
root
|-- subdir1
|-- subdir2
|-- subsubdir
因此,您可以访问:
(根目录)http://example.com/
(细分1)http://example.com/subdir1
(细分2)http://example.com/subdir2
(子目录)http://example.com/subdir2/subsubdir
RewriteRule ^(.*)$ -
在根目录中,请求是/a/b/c/d
,则捕获的URI($1
)是a/b/c/d
。但是,如果规则在子目录2
中,并且请求是/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]
RewriteRule ^foo$ bar.php [L,R]
bar.php
是相对路径,与以下路径相反:
RewriteRule ^foo$ /bar.php [L]
其中,/bar.php
是一个绝对路径。绝对路径将始终是“根”(在上面的目录结构中)。这意味着如果规则位于“root”、“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]
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/
的每个实例都更改为/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/
就是这样。一行的答案是:Rewritebase设置rewriterule arg2的基本路径 确实如此。(因此它的工作原理类似于html basehref,因为通常在URL重写的上下文中,默认基[
]是不需要的。)
如果您有多个重写规则,Rewritebase会使维护更容易。
事实上,如果您只使用了一行rewriterule,那么rewritebase是非常无用的(因为您可以简单地重写基于规则的url)。
旁注 当然,您可以完全忽略rewritebase,只使用绝对路径来重写规则。 相关的
RewriteBase
允许您调整mod_rewrite
自动作为重写规则结果前缀的路径。在.htaccess上下文中的重写是相对于包含该.htaccess文件的目录完成的。重写规则的直接结果仍然是相对于包含.htaccess文件的目录,但是mod_rewrite会调整此结果,使其相对于文档根RewriteBase
允许您修改最后一步,允许您提供一个任意的base路径,该路径在IMM之前