我有多个站点(子目录)。我想将/(*)/login
格式的所有URL重定向到/other/login
。
我尝试过:
RewriteRule ^/(.*)/login /other/login
#and
^(.*)/login /other/login
我也尝试过Redirect
。
此外,我注意到某些子文件夹也具有自己的.htaccess
文件。我是否需要将重定向规则放在子文件夹的.htaccess
文件中?当然,必须有一种更有效的方法。
答案 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路径(即,通过将正则表达式括在括号中)。