【问题标题】:htaccess Redirect 301 is chaining itselfhtaccess Redirect 301 正在链接自身
【发布时间】:2026-01-08 23:20:09
【问题描述】:

我在 .htaccess 文件中有大约 100 多个重定向,并且一些 url 相互链接。

例如:

Redirect 301 /air-india-trial/air-india-promo-conditions/ /features/

前往

/trial/air-india-promo-conditions/  

因为

Redirect 301 /air-india-trial/ /trial/

因此,由于调用了第二次重定向,因此 URL 正在将“/air-india-trial/”替换为“/trial/”。我已经尝试将https://example.com/ 放在Redirect 301 中的第二个URL 之前,但这不起作用。不确定是否重要,但新网站上不存在 URL /air-india-trial/。域名与旧网站相同。任何人有想法修复这些重定向链?

【问题讨论】:

    标签: .htaccess redirect mod-alias


    【解决方案1】:
    Redirect 301 /air-india-trial/air-india-promo-conditions/ /features/
    

    前往

    /trial/air-india-promo-conditions/
    

    大概您的意思是 请求 /air-india-trial/air-india-promo-conditions/ 最终被重定向到 /trial/air-india-promo-conditions/(那个 directive 不会“去”任何东西)。

    ...因为调用了第二个重定向。我已经尝试将https://example.com/ 放在重定向 301 中的第二个 url 之前,但这不起作用。

    您不能在第一个参数中将https://example.com/ 作为 URL 的一部分 - 如果您指的是这个?它根本不匹配。它仅与 URL 路径匹配。

    由于Redirect 指令是前缀匹配(匹配后的所有内容都被复制到目标 URL 的末尾),因此您需要按具体顺序排列您的 Redirect 指令.最具体(即最长路径)的重定向需要在不太具体的重定向之前。

    mod_alias Redirect 指令并不像您暗示的那样“链接”在一起。

    因此,在您的示例中,以下内容应该可以将 /air-india-trial/air-india-promo-conditions/ 重定向到 /features/

    Redirect 301 /air-india-trial/air-india-promo-conditions/ /features/
    Redirect 301 /air-india-trial/ /trial/
    

    (尽管您可能确实建议指令已经按顺序排列(或者您只是指问题中的顺序)?在这种情况下,与另一个指令仍然存在冲突,或者您看到的是缓存响应。)

    进行此更改后,您需要清除浏览器缓存,因为 301(永久)重定向将被浏览器缓存。

    如果您只想重定向/air-india-trial/ 而不是/air-india-trial/<something>,那么您需要使用RedirectMatch 指令,它与正则表达式匹配,而不是前缀匹配。例如:

    RedirectMatch 301 ^/air-india-trial/$ /trial/
    

    此外,如果您有任何 mod_rewrite (RewriteRule) 重定向,那么这些可能会发生冲突。由于不同的 Apache 模块在整个请求的不同时间独立运行,因此您应该避免混合来自两个模块的重定向,因为可能存在冲突。 (mod_rewrite 将始终首先在 Apache 2.4 上运行,尽管这些指令在 .htaccess 中的顺序明显。)

    【讨论】: