WordPress多语言站点切换默认语言后无重定向链的批量URL重定向
解决WordPress多语言网站重定向链问题
你的规则出现重定向链的核心原因是:当/en/xxx重定向到/xxx后,/xxx又会被第二条规则匹配(既不属于/en/也不属于/it/),进而被重定向到/it/xxx,形成/en/xxx → /xxx → /it/xxx的链式跳转,同时首页的判断逻辑也未明确区分。
以下是修正后的.htaccess规则,可完美满足需求且避免循环:
RewriteEngine On # 1. 处理 /en/* 重定向到 /*(默认英文) # 单独处理/en首页重定向到根域名首页 RewriteRule ^en$ / [R=301,L] # 处理/en/xxx格式的路径重定向到/xxx RewriteRule ^en/(.*)$ /$1 [R=301,L] # 2. 处理 site.com/*(首页除外)重定向到 /it/* # 排除根首页,避免默认英文首页被跳转 RewriteCond %{REQUEST_URI} !^/$ # 排除WordPress核心目录/文件,不影响后台和静态资源访问 RewriteCond %{REQUEST_URI} !^/wp-admin/ RewriteCond %{REQUEST_URI} !^/wp-content/ RewriteCond %{REQUEST_URI} !^/wp-includes/ # 排除已存在的文件和目录,防止静态资源被错误跳转 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 排除已经是/it/开头的路径,避免循环 RewriteCond %{REQUEST_URI} !^/it/ RewriteRule ^(.*)$ /it/$1 [R=301,L] # 保留WordPress默认路由规则(必须放在所有重定向规则之后) # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
关键细节说明:
- 优先级顺序:先处理
/en/的重定向,确保这类请求直接跳转到根路径,不会被后续规则干扰。 - 首页排除:通过
RewriteCond %{REQUEST_URI} !^/$明确保留根域名首页为英文默认页,不触发跳转。 - 资源保护:排除WordPress核心目录和已存在的文件/目录,避免后台、主题文件、图片等静态资源被错误重定向。
- 循环规避:添加
RewriteCond %{REQUEST_URI} !^/it/,防止/it/开头的路径被重复跳转。
测试建议:
- 先使用
R=302临时重定向测试,确认所有跳转逻辑正常后,再改为R=301永久重定向(避免错误跳转影响SEO)。 - 清除浏览器缓存后测试核心场景:
site.com/en/about→ 跳转至site.com/aboutsite.com/about→ 跳转至site.com/it/aboutsite.com/→ 保持为英文首页,无跳转site.com/it/about→ 保持原路径,无跳转site.com/wp-admin→ 正常访问后台,无跳转
内容的提问来源于stack exchange,提问作者Palette WebDesign
相关产品推荐
相关产品推荐

