求助:使用.htaccess将指定语言路径重定向至新路径
解决语言路径重定向的循环问题
这是重定向配置里很常见的坑!你遇到的循环问题,根源在于原规则没排除目标路径——当请求被重定向到/en/xxx后,这个新请求的URI不在你的排除列表里,会再次触发规则,导致无限循环。
问题拆解
你的需求是:
- 将
/da开头的路径完整重定向到/dk(保留子结构,比如/da/about→/dk/about) - 将
/fi开头的路径完整重定向到/en - 其他未指定的路径统一导向
/en
原规则只排除了/fi和/da,但没排除最终的目标路径/en和/dk,这就导致了循环。
正确的配置方案
调整规则顺序,先处理特定语言的跳转,再处理全局默认跳转,同时排除所有目标路径避免循环:
# 1. 优先处理/da → /dk的重定向,保留原路径子结构 RewriteCond %{REQUEST_URI} ^/da(/|$) [NC] RewriteRule ^da/(.*)$ /dk/$1 [R=301,L,QSA] # 2. 处理/fi → /en的重定向,保留原路径子结构 RewriteCond %{REQUEST_URI} ^/fi(/|$) [NC] RewriteRule ^fi/(.*)$ /en/$1 [R=301,L,QSA] # 3. 最后处理其他非指定语言的请求,统一导向/en # 这里排除了/en和/dk,避免循环 RewriteCond %{REQUEST_URI} !^/(en|dk)(/|$) [NC] RewriteRule ^(.*)$ /en/$1 [R=301,L,QSA]
关键细节说明
- 规则顺序很重要:特定语言的跳转必须放在全局规则前面,确保这些请求不会进入后续的默认重定向逻辑。
- 排除目标路径:全局规则的
RewriteCond排除了/en和/dk,这样当请求已经处于这些路径时,不会再次触发重定向,彻底解决循环问题。 - 保留子结构:
RewriteRule里的^(.*)$和/$1会完整保留原路径的子部分,保证跳转后路径结构一致。
测试小技巧
测试阶段可以把R=301改成R=302(临时重定向),避免浏览器缓存错误的重定向规则,确认所有跳转逻辑正常后,再改回R=301永久重定向。
内容的提问来源于stack exchange,提问作者perqedelius
相关产品推荐
相关产品推荐

