Nginx 默认 log_format 不包含 $http_accept_language,需手动在 http 块中添加该变量以记录客户端声明的语言偏好;配置后可通过 awk 等命令提取并统计语言分布,注意过滤空值及代理透传问题。

Nginx 默认的 log_format 不包含 $http_accept_language,但这个变量能直接反映用户浏览器声明的语言偏好(比如 zh-CN,zh;q=0.9,en;q=0.8),是分析访客语言分布最可靠的一手数据来源。
关键点在于:它记录的是客户端主动发送的 Accept-Language 请求头,不是服务器自动判断的结果,也不依赖 IP 地理位置或 Cookie。
如何配置 log_format 捕获语言信息
在 nginx.conf 的 http 块中添加或修改 log_format,显式加入 $http_accept_language:
log_format lang_analysis '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_accept_language"';
然后在 server 或 location 块中启用该格式:
access_log /var/log/nginx/access_lang.log lang_analysis;
✅ 注意:
$http_accept_language是小写、带下划线的标准变量名,拼错(如$http_acceptlanguage)会导致字段为空。
日志样例与语言字段解读
一条典型日志行可能如下:
203.124.55.88 - - [01/May/2026:17:22:03 +0800] "GET /index.html HTTP/1.1" 200 3245 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15" "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"
其中最后引号内就是 $http_accept_language 值。它按优先级顺序列出多个语言标签,用逗号分隔,q= 表示权重(quality factor)。真正起主导作用的是第一个非注释项(本例为 zh-CN)。
常见提取规则:
- 取第一个语言标签(
zh-CN、en-US、ja-JP、es-ES等) - 忽略
q=后缀和后续备选项(除非做精细化加权统计) - 统一转为小写并截取主语言码(如
zh-cn→zh,en-us→en)便于归类
后续分析建议(命令行快速上手)
假设日志已按上述配置写入 /var/log/nginx/access_lang.log,可用以下命令粗略统计主流语言分布:
# 提取每行的 Accept-Language 字段,取第一个语言标签(如 zh-CN),转小写,统计频次
awk -F'"' '{if(NF>=12) print tolower($12)}' /var/log/nginx/access_lang.log | \
cut -d',' -f1 | cut -d'-' -f1 | sort | uniq -c | sort -nr
# 输出示例:
# 1245 zh
# 892 en
# 107 ja
# 63 ko
# 41 es
如需更精确(比如区分 zh-CN 和 zh-TW),可跳过 cut -d'-' -f1 这步,直接按完整标签统计。
注意事项
- 并非所有请求都带
Accept-Language头,部分爬虫、旧客户端或定制工具可能缺失,日志中对应字段为空字符串"",分析时建议过滤掉空值。 - 移动端 App 内嵌 WebView 或某些自动化脚本可能伪造或固定该头,需结合
User-Agent交叉验证。 - 若启用了反向代理(如 CDN),原始头可能被覆盖,确保
proxy_set_header Accept-Language $http_accept_language;已正确透传。
不复杂但容易忽略。










