如何修改.htaccess语言跳转规则以保留用户手动选择的语言偏好?
解决思路
你需要先在用户手动切换语言时,给用户浏览器种下存储首选语言的Cookie,再调整.htaccess规则,优先读取Cookie值判断跳转目标,没有Cookie时再 fallback 到浏览器Accept-Language判断即可解决该问题。
在你的index.php处理语言切换的代码部分,添加Cookie设置逻辑,示例代码:
// 当用户触发语言切换操作时执行 $expire = time() + 86400 * 30; // 有效期30天,可自行调整 setcookie('preferred_lang', $_GET['lang'], $expire, '/', '.website.com'); // 域名替换为你自己的站点域名,前缀加.保证所有子站可读取该Cookie
步骤2:修改.htaccess规则
调整后的完整规则如下:
# 优先按用户手动选择的语言Cookie跳转 RewriteCond %{HTTP_COOKIE} preferred_lang=nl [NC] RewriteRule ^$ https://nl.website.com/ [L,R=302] RewriteCond %{HTTP_COOKIE} preferred_lang=tr [NC] RewriteRule ^$ https://tr.website.com/ [L,R=302] RewriteCond %{HTTP_COOKIE} preferred_lang=en [NC] RewriteRule ^$ https://www.website.com/ [L,R=302] # 没有Cookie时按浏览器默认语言跳转 RewriteCond %{HTTP:Accept-Language} ^en [NC] RewriteRule ^$ https://www.website.com/ [L,R=302] RewriteCond %{HTTP:Accept-Language} ^nl [NC] RewriteRule ^$ https://nl.website.com/ [L,R=302] RewriteCond %{HTTP:Accept-Language} ^tr [NC] RewriteRule ^$ https://tr.website.com/ [L,R=302] # 原路径映射规则保持不变 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(en|nl|tr)/?$ index.php?lang=$1 [QSA,NC,L]
注意:调试阶段先用302临时重定向,确认规则完全生效后再改成301永久重定向,避免浏览器缓存旧规则导致调试异常。
注意事项
- 测试前务必清空浏览器缓存,或使用无痕模式测试,避免之前的301重定向缓存干扰结果
- Cookie的作用域要设置正确,确保主站和所有语言子站都能读取到同一个
preferred_langCookie - 如果用户清空浏览器Cookie,会自动回退到按浏览器默认语言跳转的逻辑,符合常规产品交互逻辑
内容的提问来源于stack exchange,提问作者CWRI
相关产品推荐
相关产品推荐

