当前位置:  开发笔记 > 编程语言 > 正文

RewriteBase如何在.htaccess中工作

如何解决《RewriteBase如何在.htaccess中工作》经验,为你挑选了6个好方法。

我在几个.htaccess例子中看到了这一点

RewriteBase /

它的功能似乎与HTML 有些相似.

我相信它可能会自动将其值添加到RewriteRule语句的开头(可能没有前导斜杠)?

我无法让它正常工作.我认为它的使用对于站点可移植性非常方便,因为我经常有一个与生产服务器不同的开发服务器.我目前的方法让我删除了我的RewriteRule陈述中的部分内容.

谁能简单地向我解释如何实现它?

谢谢



1> alex..:

用我自己的话说,阅读文档和试验后:

您可以使用为重写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参数.


-1; 这个答案似乎对其他人有所帮助,但对我来说完全不透明.我可能已经猜到了*"你可以使用`RewriteBase`来为你的重写提供基础"* - 这几乎只是对这些词的重新排列 - 但我不知道在这种情况下什么是"基础"*,如果删除了"RewriteBase"行,你所给出的例子的含义也不同.我去的手册...
"脱掉RewriteBase参数" - 你的意思是rewriteRule参数吗?:)
@Kissaki:不,`$ 1`匹配带括号的RewriteRule模式,但替换的相对路径来自RewriteBase参数.因此,结果替换是`/ ~new/$ 1 /`.
@Damon:关于多个`RewriteBase`指令,请参阅[this question](http://stackoverflow.com/questions/2434820/many-rewritebase-in-one-htaccess-file).简而言之,你不能有多个 - 我认为_last_`RewriteBase`指令获胜,并影响整个.htaccess文件.

2> Simon East..:

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/

就是这样.



3> rjmunro..:

AFAIK,RewriteBase仅用于修复mod_rewrite在.htaccess不在站点根目录的文件中运行的情况,并且它猜测运行它的文件夹的错误Web路径(而不是文件系统路径).所以如果你有一个在映射到http://example.com/myfolder您的文件夹中的.htaccess中的RewriteRule 可以使用:

RewriteBase myfolder

如果mod_rewrite无法正常工作.

试图用它来实现一些不寻常的东西,而不是解决这个问题听起来像是一个非常混乱的秘诀.


它是否需要以斜杠结尾?

4> Thomas Hunte..:

RewriteBase仅在您只能将.htaccess放在站点根目录的情况下才有用.否则,您可能最好将不同的.htaccess文件放在站点的不同目录中,并完全省略RewriteBase指令.

最近,对于复杂的网站,我一直把它们拿出来,因为它使得从测试部署文件变得更加复杂.


虽然这可能是一个很好的建议,但这根本不是问题的答案.因此,它应该是对这个问题的评论,没有收到(尽可能多的)赞成票,绝对不被接受为"答案".
"最好将不同的.htaccess文件放在不同的目录中" - 我不确定这是一个好建议吗?在您的站点上点缀.htaccess文件会使调试/维护成为一场噩梦.我会说在你网站的根目录中有一个.htaccess文件是_preferable_.

5> user1669830..:

当我开发时,它位于文件夹中的不同域中.当我现场直播时,该文件夹不再存在.使用RewriteBase允许我在两个环境中使用相同的.htaccess文件.

住的时候:

RewriteBase /
# RewriteBase /dev_folder/

开发时:

# RewriteBase /
RewriteBase /dev_folder/


我相信这不会一直有效.如果你在`RewriteCond`指令中使用`%{REQUEST_URI}`怎么办?

6> DWB..:

我发现的最清晰的解释不在当前的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文档继续提供"有关内部处理步骤的详细信息".

获得的经验:虽然我们需要熟悉"当前",但在历史中可以找到宝石.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有