Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache RewriteBase做什么以及如何使用它?_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

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/
    (根目录)
  • http://example.com/subdir1
    (细分1)
  • http://example.com/subdir2
    (细分2)
  • http://example.com/subdir2/subsubdir
    (子目录)
通过重写规则发送的URI与目录相关。因此,如果你有:

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之前