RewriteBase 值去哪儿了?

Where RewriteBase value goes?

我将从这个答案中提取代码: Redirect folder to another with htaccess

那么,我想知道 RewriteBase 的真正用途是什么?!根据链接答案中的聪明人,它转到 RewriteRule 的第一部分。所以第二部分需要一个斜线("/")

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteRule ^test/(.*)$ /new/ [L,NC,R=302]

我不记得在哪里,但我在某处读到它转到了第二部分。而实际上我的.htaccess 就是按照这个规则写的。所以,我的重写规则是这样的

RewriteRule ^script$ folder/some_script [L,NC,R=302]

实际上它对我有用。但是现在我阅读了链接的答案,因为我需要其他东西而且我很困惑。我不知道这是否会影响性能,我只想做对。我想知道第一部分、第二部分或两者的“真正走向何方”?现在我需要从文件夹+脚本重定向到另一个文件夹+脚本。那么应该如何呢?

#v1
RewriteBase /
RewriteRule ^/folder/some_script$ other_folder/some_other_script [L,NC,R=302]

#v2
RewriteBase /
RewriteRule ^folder/some_script$ /other_folder/some_other_script [L,NC,R=302]

#v3
RewriteBase /
RewriteRule ^/folder/some_script$ /other_folder/some_other_script [L,NC,R=302]⠀

#v4
RewriteBase /
RewriteRule ^folder/some_script$ other_folder/some_other_script [L,NC,R=302]⠀

我想澄清一下“是的”,我需要重定向到另一个文件夹,该文件夹有一个不同名称的脚本,所以我不需要这个“$1”。还有一件事请不要猜测,如果您不确定就不要回答。我也能猜出很多东西,我可以测试这是否可行。我知道当我把斜杠放在第二部分时,它会起作用,如果你不把它也起作用。我的意思是:

RewriteBase /
# this works for me correctly
RewriteRule ^some_script$ folder/some_script [L,NC,R=302]

# this also works for me correctly, but I use the first way
# RewriteRule ^script$ /folder/some_script [L,NC,R=302]

我想知道这是怎么回事!我想知道如何通过从文件夹重定向正确地做到这一点。

如果 RewriteRule 的目标(第二个参数)是相对的,那么 RewriteBase 的值会被添加到它的前面。

所以,我们以RewriteBase /some/path/为例。

  • RewriteRule ^foo$ /bar:RewriteBase 不适用,因为目标 (/bar) 是绝对的
  • RewriteRule ^foo$ http://%{HTTP_HOST}/bar:相同,因为它是到 URL 的 HTTP 重定向,仍然不是相对路径
  • RewriteRule ^foo$ barRewriteBase 适用,因为 bar 是相对的,所以请求 /foo 将被重写为 /some/path/bar

但是,等等,它也可以在没有显式 RewriteBase 的情况下工作?是的,它 可以 :Apache 能够“猜测”默认情况下添加到相对目标的路径,但在某些情况下 Apache 无法正确猜测它(当Alias 来玩或使用 VirtualDocumentRoot,例如 UserDir

在使用相对路径(而不是 URL)的重定向(R=30[12])的情况下,Apache 的工作方式相同:它会在 ServerName 和适当的方案。

注:

RewriteRule ^/folder/some_script$ ...

在目录上下文中,例如 .htaccess 文件,由于 ^/,这种规则永远不会匹配,因为 Apache 会截断路径以删除与此上下文相对应的路径部分,包括其最后一个/(例如:如果 URL 的路径是 /foo,则 RewriteRule 在位于 DocumentRoot 的 .htaccess 文件中测试的路径只是 foo , 而不是字符串 /foo).