【问题标题】:.htaccess redirect all subfolders to specific path.htaccess 将所有子文件夹重定向到特定路径
【发布时间】:2018-10-26 22:30:55
【问题描述】:

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

我试过了:

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

我也试过Redirect

此外,我注意到一些子文件夹也有自己的.htaccess 文件。我需要将重定向规则放在子文件夹的.htaccess 文件中吗?肯定有更有效的方法。

【问题讨论】:

    标签: .htaccess mod-rewrite mod-alias


    【解决方案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 路径上的斜杠前缀,而 RedirectMatch 使用。如果不需要,则无需捕获 URL 路径(即通过将正则表达式括在括号中)。

    【讨论】:

    • 这很接近,但我不得不修改以创建一个 RewriteCond 以与 /other/login 不匹配并创建一个循环
    • @Rodrick 是的 - 我忽略了这一点! (如果 /other 子目录包含带有 mod_rewrite 指令的 .htaccess 文件,那么这也可以避免重定向循环。)我已经更新了我的答案。
    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2019-05-15
    • 2017-08-13
    相关资源
    最近更新 更多