apache 不自动识别客户端语言,但可通过 accept-language 头结合 mod_rewrite 与 mod_proxy 实现语言感知路由:提取头信息、正则匹配 zh/en 等前缀、代理至对应后端,并配置兜底默认路由及 proxypreservehost。

Apache 本身不自动识别客户端语言并路由,但可以通过 Accept-Language 请求头 + mod_rewrite + mod_proxy 实现基础的语言感知路由分发。关键不是“自动”,而是用规则提取语言偏好、匹配目标后端,并代理过去。
提取 Accept-Language 并做简单匹配
浏览器在请求中携带 Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 这类头。Apache 可用 %{HTTP:Accept-Language} 获取原始值,再用正则判断首选语言。
例如,把中文用户(zh 或 zh-CN)导向中文服务,英文用户(en)导向英文服务:
# 先检查 Accept-Language 是否以 zh 开头(含 zh-CN、zh-TW 等)
RewriteCond %{HTTP:Accept-Language} ^zh [NC]
RewriteRule ^/(.*)$ http://backend-zh:8080/$1 [P,L]
# 再检查是否以 en 开头(含 en-US、en-GB)
RewriteCond %{HTTP:Accept-Language} ^en [NC]
RewriteRule ^/(.*)$ http://backend-en:8080/$1 [P,L]
# 默认兜底到通用后端
ProxyPass / http://backend-default:8080/
ProxyPassReverse / http://backend-default:8080/
注意:
-
[P]表示反向代理(内部转发),不是跳转; -
[NC]忽略大小写; - 条件顺序很重要,先匹配更具体的语言标识(如
zh-CN),再宽泛的(如zh); - 若需精确匹配
zh-CN而非zh-TW,可改用^zh-CN\b或(^|,)zh-CN(,|$)。
配合 ProxyPreserveHost 保留原始 Host
语言路由后,后端可能依赖 Host 头做多租户或 CDN 识别:
ProxyPreserveHost On
放在 <virtualhost></virtualhost> 块内或全局配置里即可。
简单 fallback 与兜底逻辑
语言头可能为空、格式异常或不匹配任何规则。建议始终配一个默认 ProxyPass 作为兜底,避免 503 错误:
# 上面所有 RewriteRule 都不命中时,走这里 ProxyPass / http://backend-default:8080/ ProxyPassReverse / http://backend-default:8080/
也可以用 RewriteRule 最后加 [L] 后显式终止,再用 ProxyPass 做默认,效果一致。
实际部署小提示
- 测试时用 curl 模拟不同语言头:
curl -H "Accept-Language: zh-CN" http://your-domain.com/api/usercurl -H "Accept-Language: en-US" http://your-domain.com/api/user - 不要依赖语言头做登录态或权限控制,它可被随意篡改;
- 若后端是 Java/Spring Boot,注意
JSESSIONIDCookie 的会话粘性需配合stickysession设置(如ProxySet stickysession=JSESSIONID); - 静态资源(如
/css/,/img/)建议不参与语言路由,直接由 Apache 提供,避免代理开销。
不复杂但容易忽略。










