proxy_set_header accept-language用于透传或覆盖客户端语言偏好:默认需显式配置proxy_set_header accept-language $http_accept_language;以转发原始头,或设为固定值如"zh-cn,zh;q=0.9";支持map条件映射,但不可在upstream块中使用。

在 Nginx 中,用 proxy_set_header 传递多语言偏好(即 Accept-Language)请求头很简单:只需原样转发客户端发来的该头,或按需覆盖为固定值。关键在于理解它何时生效、如何避免被覆盖,以及是否需要配合其他指令。
直接透传客户端的 Accept-Language
这是最常见做法。Nginx 默认不会自动转发请求头给上游,必须显式声明:
- 在
location或server块中添加:proxy_set_header Accept-Language $http_accept_language; -
$http_accept_language是 Nginx 内置变量,自动提取客户端请求中的Accept-Language头内容(如zh-CN,zh;q=0.9,en;q=0.8) - 若客户端没带这个头,变量为空,上游收到的
Accept-Language就会是空值——多数后端会按默认语言处理
强制设置固定多语言偏好
适用于灰度测试、A/B 实验或统一区域化策略:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 例如强制所有请求带中文偏好:
proxy_set_header Accept-Language "zh-CN,zh;q=0.9"; - 注意:双引号必须保留,否则分号会被 Nginx 解析为指令分隔符
- 如果同时用了
proxy_set_header Accept-Language $http_accept_language;,后写的那条会覆盖前一条——Nginx 按配置顺序最后生效
条件化设置(按域名/路径/参数区分)
可根据实际场景动态调整:
- 对特定子域名启用英文优先:
if ($host = 'en.example.com') {<br> proxy_set_header Accept-Language "en-US,en;q=0.9";<br>} - 更推荐用
map块做映射(性能更好、支持嵌套逻辑):map $host $lang_header {<br> default "zh-CN,zh;q=0.9";<br> en.example.com "en-US,en;q=0.9";<br> ja.example.com "ja-JP,ja;q=0.9";<br>}
然后在 location 中写:proxy_set_header Accept-Language $lang_header;
注意事项与常见坑
避免以下典型问题:
-
不要遗漏
proxy_set_header Host:虽然和语言无关,但若没设,上游可能无法正确路由或生成绝对链接 -
避免重复定义导致覆盖:检查是否有多个
proxy_set_header Accept-Language出现在不同作用域(如 http → server → location),以最内层为准 -
不建议在 upstream 块里写
proxy_set_header:它只在 location/server 等代理上下文中有效,upstream 块里写会报错 -
调试时可用
add_header回显:比如add_header X-Debug-Accept-Language $http_accept_language;,方便确认客户端值是否到达 Nginx










