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$ bar
:RewriteBase
适用,因为 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
).
我将从这个答案中提取代码: 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$ bar
:RewriteBase
适用,因为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
).