我在几个.htaccess
例子中看到了这一点
RewriteBase /
它的功能似乎与
HTML 有些相似.
我相信它可能会自动将其值添加到RewriteRule
语句的开头(可能没有前导斜杠)?
我无法让它正常工作.我认为它的使用对于站点可移植性非常方便,因为我经常有一个与生产服务器不同的开发服务器.我目前的方法让我删除了我的RewriteRule
陈述中的部分内容.
谁能简单地向我解释如何实现它?
谢谢
用我自己的话说,阅读文档和试验后:
您可以使用为重写RewriteBase
提供基础.考虑一下
# invoke rewrite engine RewriteEngine On RewriteBase /~new/ # add trailing slash if missing rewriteRule ^(([a-z0-9\-]+/)*[a-z0-9\-]+)$ $1/ [NC,R=301,L]
这是我用来确保URL具有尾部斜杠的真实规则.这将转换
http://www.example.com/~new/page
至
http://www.example.com/~new/page/
通过在RewriteBase
那里,你使相对路径脱离RewriteBase
参数.
RewriteBase
仅施加到靶上相对重写规则.
像这样使用RewriteBase ......
RewriteBase /folder/ RewriteRule a\.html b.html
与...基本相同
RewriteRule a\.html /folder/b.html
但是当.htaccess文件在里面时,/folder/
这也指向同一个目标:
RewriteRule a\.html b.html
虽然文档暗示总是使用a RewriteBase
,但Apache通常会为DocumentRoot下的路径正确检测它,除非:
您正在使用Alias
指令
您正在使用.htaccess重写规则来执行HTTP重定向(而不仅仅是静默重写)到相对URL
在这些情况下,您可能会发现需要指定RewriteBase.
但是,由于它是一个令人困惑的指令,通常最好在重写目标中指定绝对(也称为"根相对")URI.阅读规则的其他开发人员将更容易掌握这些规则.
引自Jon Lin在这里的优秀深度答案:
在一个htaccess文件,mod_rewrite的工作原理类似于
或
容器.并且RewriteBase
用于提供相对路径基础.
例如,假设您有此文件夹结构:
DocumentRoot |-- subdir1 `-- subdir2 `-- subsubdir
所以你可以访问:
http://example.com/
(根)
http://example.com/subdir1
(subdir1)
http://example.com/subdir2
(subdir2)
http://example.com/subdir2/subsubdir
(subsubdir)
通过a发送的URI RewriteRule
相对于包含htaccess文件的目录.所以如果你有:
RewriteRule ^(.*)$ -
在根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中剥离.重写基础对此没有影响,这就是每个目录的工作原理.
重写基础的作用是为规则目标中的任何相对路径提供URL路径库(不是文件路径库).所以说你有这个规则:
RewriteRule ^foo$ bar.php [L]
这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,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/
就是这样.
AFAIK,RewriteBase仅用于修复mod_rewrite在.htaccess
不在站点根目录的文件中运行的情况,并且它猜测运行它的文件夹的错误Web路径(而不是文件系统路径).所以如果你有一个在映射到http://example.com/myfolder
您的文件夹中的.htaccess中的RewriteRule 可以使用:
RewriteBase myfolder
如果mod_rewrite无法正常工作.
试图用它来实现一些不寻常的东西,而不是解决这个问题听起来像是一个非常混乱的秘诀.
RewriteBase仅在您只能将.htaccess放在站点根目录的情况下才有用.否则,您可能最好将不同的.htaccess文件放在站点的不同目录中,并完全省略RewriteBase指令.
最近,对于复杂的网站,我一直把它们拿出来,因为它使得从测试部署文件变得更加复杂.
当我开发时,它位于文件夹中的不同域中.当我现场直播时,该文件夹不再存在.使用RewriteBase允许我在两个环境中使用相同的.htaccess文件.
住的时候:
RewriteBase / # RewriteBase /dev_folder/
开发时:
# RewriteBase / RewriteBase /dev_folder/
我发现的最清晰的解释不在当前的2.4 apache文档中,而是在2.0版本中.
# /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
它是如何工作的?对于你的apache黑客,这个2.0文档继续提供"有关内部处理步骤的详细信息".
获得的经验:虽然我们需要熟悉"当前",但在历史中可以找到宝石.