.htaccess将所有子文件夹重定向到特定路径

时间:2018-10-26 22:30:55

标签: .htaccess mod-rewrite mod-alias

我有多个站点(子目录)。我想将/(*)/login格式的所有URL重定向到/other/login

我尝试过:

RewriteRule ^/(.*)/login /other/login
#and 
^(.*)/login /other/login

我也尝试过Redirect

此外,我注意到某些子文件夹也具有自己的.htaccess文件。我是否需要将重定向规则放在子文件夹的.htaccess文件中?当然,必须有一种更有效的方法。

1 个答案:

答案 0 :(得分:1)

  

我注意到某些子文件夹也有自己的.htaccess文件,是否需要将重定向规则放在子文件夹.htaccess文件中?

默认情况下,子.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文件)。

这是一个外部“重定向”(如您的问题所述)。 URL在浏览器的地址栏中更改。您可以通过删除R标志(尽管这可能取决于您的应用程序)来将其更改为内部重写(如您的当前指令所暗示)。


如果仅希望“重定向”,则可以使用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路径上使用斜杠前缀。如果不需要,则无需捕获URL路径(即,通过将正则表达式括在括号中)。