.htaccess 将所有子文件夹重定向到特定路径
.htaccess redirect all subfolders to specific path
我有多个站点(子目录)。我想将 /(*)/login
格式的所有 URL 重定向到 /other/login
.
我试过:
RewriteRule ^/(.*)/login /other/login
#and
^(.*)/login /other/login
我也试过了Redirect
。
此外,我注意到一些子文件夹也有自己的 .htaccess
文件。我需要将重定向规则放在子文件夹的 .htaccess
文件中吗?肯定有更有效的方法。
I notice some subfolder have their own .htaccess
files also, do I need to put the redirect rule in the subfolder .htaccess
files?
默认情况下,子 .htaccess
文件中的任何 mod_rewrite 指令将完全覆盖任何父 .htaccess
文件中的 mod_rewrite 指令,它们不是 继承。但是,您可以更改此行为。在 Apache 2.2 上,这是非常有限的,因为无论如何您都需要更改子 .htaccess
文件,因此在子配置中简单地复制此指令可能会更容易。但在 Apache 2.4.8+ 上,您可以在父 .htaccess
文件中执行所有这些操作。例如:
RewriteEngine On
RewriteOptions InheritDownBefore
RewriteCond %{REQUEST_URI} !^/other
RewriteRule ^[^/]+/login$ /other/login [R=302,L]
InheritDownBefore
选项导致当前 mod_rewrite 指令被应用 在 任何子配置中的 mod_rewrite 指令之前。
需要 RewriteCond
指令以防止重定向循环(如果 /other
子目录没有自己的包含 mod_rewrite 指令的 .htaccess
文件)。
这是一个外部 "redirect"(如您的问题所述)。浏览器地址栏中的 URL 发生变化。您可以通过删除 R
标志(尽管这可能取决于您的应用程序)将其更改为内部重写(正如您当前的指令所暗示的那样)。
如果你只是想要一个 "redirect" 那么你可以使用 mod_alias RedirectMatch
指令而不是上面的 mod_rewrite 指令。这与 mod_rewrite 分开运行,但请注意,首先处理任何 mod_rewrite 指令(在子配置中)。例如:
RedirectMatch 302 ^/(?!other)[^/]+/login$ /other/login
RedirectMatch
指令使用正则表达式,而 Redirect
(还有 mod_alias)使用简单的前缀匹配。因此,您无法使用简单的 Redirect
.
来匹配这个特定的 模式
(?!other)
部分是一个否定前瞻(零宽度断言),它检查匹配的 URL 路径是否开始 other
- 为了避免重定向循环。
另请注意,RewriteRule
不在 URL 路径上使用斜杠前缀,而 RedirectMatch
会。如果不需要,则无需捕获 URL 路径(即通过将正则表达式括在括号中)。
我有多个站点(子目录)。我想将 /(*)/login
格式的所有 URL 重定向到 /other/login
.
我试过:
RewriteRule ^/(.*)/login /other/login
#and
^(.*)/login /other/login
我也试过了Redirect
。
此外,我注意到一些子文件夹也有自己的 .htaccess
文件。我需要将重定向规则放在子文件夹的 .htaccess
文件中吗?肯定有更有效的方法。
I notice some subfolder have their own
.htaccess
files also, do I need to put the redirect rule in the subfolder.htaccess
files?
默认情况下,子 .htaccess
文件中的任何 mod_rewrite 指令将完全覆盖任何父 .htaccess
文件中的 mod_rewrite 指令,它们不是 继承。但是,您可以更改此行为。在 Apache 2.2 上,这是非常有限的,因为无论如何您都需要更改子 .htaccess
文件,因此在子配置中简单地复制此指令可能会更容易。但在 Apache 2.4.8+ 上,您可以在父 .htaccess
文件中执行所有这些操作。例如:
RewriteEngine On
RewriteOptions InheritDownBefore
RewriteCond %{REQUEST_URI} !^/other
RewriteRule ^[^/]+/login$ /other/login [R=302,L]
InheritDownBefore
选项导致当前 mod_rewrite 指令被应用 在 任何子配置中的 mod_rewrite 指令之前。
需要 RewriteCond
指令以防止重定向循环(如果 /other
子目录没有自己的包含 mod_rewrite 指令的 .htaccess
文件)。
这是一个外部 "redirect"(如您的问题所述)。浏览器地址栏中的 URL 发生变化。您可以通过删除 R
标志(尽管这可能取决于您的应用程序)将其更改为内部重写(正如您当前的指令所暗示的那样)。
如果你只是想要一个 "redirect" 那么你可以使用 mod_alias RedirectMatch
指令而不是上面的 mod_rewrite 指令。这与 mod_rewrite 分开运行,但请注意,首先处理任何 mod_rewrite 指令(在子配置中)。例如:
RedirectMatch 302 ^/(?!other)[^/]+/login$ /other/login
RedirectMatch
指令使用正则表达式,而 Redirect
(还有 mod_alias)使用简单的前缀匹配。因此,您无法使用简单的 Redirect
.
(?!other)
部分是一个否定前瞻(零宽度断言),它检查匹配的 URL 路径是否开始 other
- 为了避免重定向循环。
另请注意,RewriteRule
不在 URL 路径上使用斜杠前缀,而 RedirectMatch
会。如果不需要,则无需捕获 URL 路径(即通过将正则表达式括在括号中)。