.htaccess配置:将无语言子目录域名重定向至对应语言子目录
解决重定向循环问题,实现domain.it到domain.com/it/的正确重定向
你的问题核心是重定向目标写错了,同时规则没有区分已完成重定向的请求,导致了无限循环。咱们一步步来修正:
为什么会出现循环?
你原来的规则把domain.it重定向到了同域名下的www.domain.it/it/,当这个重定向请求到达服务器时,HTTP_HOST仍然是www.domain.it,满足规则里的^(www\.)?domain.it$条件,规则会再次触发重定向,就这样陷入了循环。
正确的.htaccess配置
我们需要把domain.it(包括带www的版本)的所有请求直接重定向到domain.com/it/,这样重定向后的请求域名变成domain.com,不会再触发针对domain.it的规则,彻底避免循环。
完整规则如下:
# 1. 处理 domain.it 的重定向:所有请求转到 domain.com/it/ RewriteCond %{HTTP_HOST} ^(www\.)?domain\.it$ [NC] RewriteRule ^(.*)$ https://www.domain.com/it/$1 [R=301,L] # 2. 可选:处理 domain.com 上的非语言目录请求(如果需要) # 如果访问 domain.com 根目录或其他非/en/、/it/路径,重定向到/it/ RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com$ [NC] RewriteCond %{REQUEST_URI} !^/(en|it)/ [NC] RewriteRule ^(.*)$ https://www.domain.com/it/$1 [R=301,L]
关键细节说明
- 目标域名修正:把重定向目标从
www.domain.it/it/改成www.domain.com/it/,跨域名跳转后,原规则的触发条件不再满足,自然不会循环。 - 保留请求路径:
RewriteRule里的$1会把原请求的路径(比如domain.it/about)带到新地址(变成domain.com/it/about),保证用户访问的内容对应正确。 - 缓存注意:如果之前用了301重定向,浏览器会缓存旧规则,测试时记得清除浏览器缓存,或者先改用
R=302临时重定向,确认没问题后再改回301。
内容的提问来源于stack exchange,提问作者Michele Posenato
相关产品推荐
相关产品推荐

