apache通过mod_rewrite提取accept-language头,按zh/en/ja优先级匹配并重定向至对应子域名,需启用rewrite模块、避免循环跳转、用r=302调试后改r=301。

Apache 中 VirtualHost 配置多语言站点并根据浏览器语言自动重定向,核心是用 mod_rewrite 提取 Accept-Language 请求头,再结合条件判断跳转到对应子域名(如 zh.example.com、en.example.com),同时避免循环和误匹配。
确保 mod_rewrite 已启用且语法正确
重定向依赖 mod_rewrite 模块。先确认它已加载:
- Debian/Ubuntu:运行
sudo a2enmod rewrite,然后sudo systemctl restart apache2 - RHEL/CentOS:检查
/etc/httpd/conf/httpd.conf中是否含LoadModule rewrite_module modules/mod_rewrite.so,未注释即启用 - 无论哪种系统,都需在 VirtualHost 块内或主配置中开启:
RewriteEngine On
提取 Accept-Language 并匹配主语言标签
浏览器发送的语言头形如 zh-CN,zh;q=0.9,en-US;q=0.8,Apache 只能用正则从中提取关键部分。务必使用标准变量写法:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- ✅ 正确:
%{HTTP:Accept-Language}(注意冒号,不是下划线) - ❌ 错误:
%{HTTP_ACCEPT_LANGUAGE}(旧写法,部分版本兼容但不推荐) - 匹配中文用户示例(支持 zh-CN / zh-TW / zh 等):
RewriteCond %{HTTP:Accept-Language} ^zh [NC,OR]<br>RewriteCond %{HTTP:Accept-Language} ,zh- [NC] - 匹配英文用户(优先 en-US,再泛 en):
RewriteCond %{HTTP:Accept-Language} ^en-US [NC,OR]<br>RewriteCond %{HTTP:Accept-Language} ,en-US [NC,OR]<br>RewriteCond %{HTTP:Accept-Language} ^en [NC,OR]<br>RewriteCond %{HTTP:Accept-Language} ,en [NC]
防止循环重定向与按优先级执行
若用户已访问 zh.example.com,不应再跳转;多个语言规则也需控制顺序,避免低优先级覆盖高优先级:
- 每条 RewriteRule 前必须加「非目标域名」判断:
RewriteCond %{HTTP_HOST} !^zh\.example\.com$ [NC] - 把最具体的语言(如
zh-TW)放在前面,泛匹配(如zh)放后面 - 用
[L]标志终止当前规则链,避免后续规则干扰 - 调试阶段用
R=302(临时跳转),上线前改R=301
完整 VirtualHost 示例(支持 zh / en / ja)
以下配置放在 /etc/apache2/sites-available/example.com.conf 的 <virtualhost></virtualhost> 块内:
RewriteEngine On
<h1>排除爬虫(可选)</h1><p>RewriteCond %{HTTP_USER_AGENT} (bot|crawl|slurp|spider) [NC]
RewriteRule ^ - [L]</p><h1>匹配日语并跳转</h1><p>RewriteCond %{HTTP:Accept-Language} ^ja [NC,OR]
RewriteCond %{HTTP:Accept-Language} ,ja [NC]
RewriteCond %{HTTP_HOST} !^ja.example.com$ [NC]
RewriteRule ^(.*)$ <a href="https://www.php.cn/link/69985c866bfebe95f0a8913157b75113">https://www.php.cn/link/69985c866bfebe95f0a8913157b75113</a> [R=302,L]</p><h1>匹配中文并跳转</h1><p>RewriteCond %{HTTP:Accept-Language} ^zh [NC,OR]
RewriteCond %{HTTP:Accept-Language} ,zh- [NC]
RewriteCond %{HTTP_HOST} !^zh.example.com$ [NC]
RewriteRule ^(.*)$ <a href="https://www.php.cn/link/cdb895d9b33985892dc17901dd73aca1">https://www.php.cn/link/cdb895d9b33985892dc17901dd73aca1</a> [R=302,L]</p><h1>匹配英文并跳转(兜底)</h1><p>RewriteCond %{HTTP_HOST} !^en.example.com$ [NC]
RewriteRule ^(.*)$ <a href="https://www.php.cn/link/35b7d01136aac5d9496d9c3d43d92dae">https://www.php.cn/link/35b7d01136aac5d9496d9c3d43d92dae</a> [R=302,L]
</p>
配置完后,运行 sudo apache2ctl -t 检查语法,再 sudo systemctl reload apache2 生效。上线前请将所有 R=302 改为 R=301。










