# /abc/def/.htaccess -- per-dir config file for directory /abc/def
# Remember: /abc/def is the physical path of /xyz, i.e., the server
# has a 'Alias /xyz /abc/def' directive e.g.
RewriteEngine On
# let the server know that we were reached via /xyz and not
# via the physical path prefix /abc/def
RewriteBase /xyz
9条答案
按热度按时间hl0ma9xz1#
RewriteBase
仅适用于***相对***重写规则的*目标。/folder/
中时,它也指向同一个目标:尽管文档暗示总是使用
RewriteBase
,但Apache通常会正确检测DocumentRoot下的路径,除非:Alias
指令在这些情况下,您可能会发现需要指定RewriteBase。
然而,由于这是一个令人困惑的指令,通常最好在重写目标中简单地指定绝对(也称为“根相对”)URI。阅读您的规则的其他开发人员将更容易理解这些规则。
在htaccess文件中,mod_rewrite的工作方式类似于
<Directory>
或<Location>
容器,并且RewriteBase
用于提供相对路径基。例如,假设您有以下文件夹结构:
因此,您可以访问:
http://example.com/
(根目录)http://example.com/subdir1
(子目录1)http://example.com/subdir2
(子目录2)http://example.com/subdir2/subsubdir
(子子目录)通过
RewriteRule
发送的URI相对于包含htaccess文件的目录。/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中剥离该部分。重写基础对此没有影响,这只是每个目录的工作方式。
rewrite base * 所做的 * 是为规则的target中的任何相对路径**提供一个URL路径基(* 不是 * 文件路径基)。
bar.php
是相对路径,与以下路径相对:其中
/bar.php
是绝对路径。绝对路径 * 总是 * 是“root”(在上面的目录结构中)。这意味着不管规则是在“root”、“subdir1”、“subsubdir”等等中,/bar.php
路径总是Map到http://example.com/bar.php
。但另一个规则(使用相对路径)基于该规则所在的目录。
在“root”目录中,如果您转到
http://example.com/foo
,则会得到http://example.com/bar.php
。但如果该规则在“subdir1”目录中,如果您转到http://example.com/subdir1/foo
,则会得到http://example.com/subdir1/bar.php
。以此类推。这有时有效,有时无效,正如文档中所述,对于相对路径,它应该是 * 必需的 *,但大多数时候它似乎都能正常工作,除了重定向的时候(使用R
标志,或者因为规则的目标中有http://host
而隐式地重定向)。如果它在“subdir2”目录中,并且您转到
http://example.com/subdir2/foo
,mod_rewrite会将相对路径错误地当作文件路径而不是URL路径,并且由于R
标志,您最终将被重定向到类似以下的位置:http://example.com/var/www/localhost/htdocs/subdir1
.这显然不是你想要的。**这就是
RewriteBase
的作用所在。该指令告诉mod_rewrite要在每个相对路径的开头追加什么内容。**因此,如果我有:在“subsubdir”中,转到
http://example.com/subdir2/subsubdir/foo
实际上会为我提供http://example.com/blah/bar.php
。“bar.php”被添加到base的末尾。实际上,这个例子通常不是你想要的,因为你不能在同一个目录容器或htaccess文件中有多个base。在大多数情况下,它的用法如下:
其中这些规则位于“subdir1”目录中,
将位于“subsubdir”目录中。
这在一定程度上允许您使规则具有可移植性,因此您可以将它们放在任何目录中,并且只需要更改基本规则而不是一堆规则。例如,如果您有:
这样转到
http://example.com/subdir1/foo
将服务于http://example.com/subdir1/bar.php
等。假设您决定将所有这些文件和规则移动到“subsubdir”目录。然后,当您需要将这些文件和规则移动到另一个目录时,只需更改基本目录:
就是这样。
0yycz8jy2#
用我自己的话来说,在阅读了这些文档并进行了实验之后:
可以使用
RewriteBase
为重写提供一个 base。这是我用来确保URL后面有斜杠的一个真实的的规则。
至
通过将
RewriteBase
放在那里,可以使相对路径脱离RewriteBase
参数。twh00eeo3#
AFAIK,RewriteBase仅用于修复mod_rewrite在
.htaccess
文件中运行,而不是在站点根目录下运行,并且它猜测运行文件夹的Web路径(而不是文件系统路径)错误的情况。因此,如果您在Map到http://example.com/myfolder
的文件夹中的.htaccess中有RewriteRule,则可以用途:如果mod_rewrite无法正常工作。
试图用它来实现一些不寻常的事情,而不是解决这个问题听起来像是一个食谱变得非常困惑。
6xfqseft4#
RewriteBase仅在只能将.htaccess放在站点根目录的情况下有用。否则,最好将不同的.htaccess文件放在站点的不同目录中,并完全省略RewriteBase指令。
最近,对于复杂的站点,我已经把它们去掉了,因为这使得从测试到上线部署文件只需要多一个步骤就可以了。
41ik7eoe5#
当我开发时,它在一个文件夹中的不同域上。当我启动一个站点时,那个文件夹不再存在。使用RewriteBase允许我在两个环境中使用相同的.htaccess文件。
实时:
开发时:
piok6c0g6#
我找到的最清楚的解释不是在当前的2.4 apache文档中,而是在2.0版本中。
它是如何工作的?对于apache黑客来说,这篇2.0文档继续给予“关于内部处理步骤的详细信息”。
经验教训:虽然我们需要熟悉“当前”,但宝石可以在编年史中找到。
5tmbdcev7#
此命令可以显式设置重写的基URL。如果希望从域的根目录开始,则应在RewriteRule之前包含以下行:
iugsix8n8#
我相信这段来自Apache文档的摘录很好地补充了前面的答案:
当您在每个目录(htaccess)上下文中的替换中使用相对路径时,需要此指令,除非满足以下任一条件:
如前所述,在其他情况下,只有使规则更短才有用。此外,也如前所述,您可以通过将htaccess文件放在子目录中来实现同样的目的。
axr492tv9#
我只是删除了.htaccess文件,它就可以完美运行了