我正在尝试学习一些.htaccess
技巧。 我遇到了RewriteBase
指令,但无法正常工作。
我想知道这个指令具体是什么,以及如何使用它。 关于StackOverflow中的RewriteBase
和Apache文档已经有了一些讨论,但是我仍然无法明确地回答我的问题。
有人能告诉我一个简单但有效的例子, 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,只使用绝对路径进行重写。
有关