Nginx 无法直接记录分辨率,因其不在 HTTP 请求中;但可记录浏览器语言(Accept-Language),需在 log_format 中显式添加 "$http_accept_language" 变量。

浏览器语言(Accept-Language)和分辨率(screen.width × screen.height)**无法通过 Nginx 原生日志直接记录**,因为这两项信息不属于 HTTP 请求头的必传字段,且分辨率根本不在请求中——它只存在于前端 JavaScript 运行时环境。
为什么 Nginx 日志里没有浏览器语言和分辨率
Nginx 只能记录客户端在 HTTP 请求中实际发送的头部字段。其中:
-
浏览器语言:由
Accept-Language请求头携带(如zh-CN,zh;q=0.9,en;q=0.8),Nginx 可以记录,但默认 log_format 不包含该变量; - 分辨率:完全不出现在 HTTP 请求中,是前端运行时属性,Nginx 无从获取,必须靠 JS 主动上报。
如何让 Nginx 记录 Accept-Language(浏览器语言)
只需在 log_format 中添加 $http_accept_language 变量,并确保引号包裹:
log_format extended '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_accept_language"'; // ← 关键新增项
access_log /var/log/nginx/access.log extended;验证是否生效:查一条真实日志,末尾应出现类似 "zh-CN,zh;q=0.9,en;q=0.8" 的字符串。注意大小写必须为 accept_language(下划线,全小写),不能写成 acceptlanguage 或 Accept-Language。
分辨率信息必须由前端主动采集并上报
常见做法是用 JavaScript 获取后,通过以下任一方式发给服务端:
-
埋点接口:在页面加载或用户首次交互时,向一个轻量 API(如
/api/screen)POST 分辨率、设备类型等; -
附加到现有请求:在关键请求(如登录、上报行为)的 query 或 body 中带上
screen_w=390&screen_h=844; -
写入 Cookie 后透传:JS 设置
screen=390x844,Nginx 配置$cookie_screen变量并写入日志(需注意 Cookie 可被用户清除或禁用)。
不建议将分辨率作为 URL 参数长期暴露,也不推荐依赖 User-Agent 推断分辨率(准确率极低,iPad Pro / Surface Pro 等设备 UA 无区分度)。
分析语言与设备特征的实用技巧
拿到含 $http_accept_language 的日志后,可用 shell 快速统计主流语言分布:
# 提取并标准化语言标签(取第一个,转小写,去修饰符)
awk -F'"' '{if(NF>6) print $8}' access.log | \
grep -v '^-$' | \
awk -F',' '{split($1,a,";"); gsub(/^[ \t]+|[ \t]+$/, "", a[1]); print tolower(a[1])}' | \
sort | uniq -c | sort -rn | head -10输出示例:
12450 zh-cn
8721 en-us
2103 ja-jp
1892 ko-kr
若已通过埋点收集分辨率,可结合 IP 或 UA 聚类分析:
– 宽屏(≥1200px)+ Windows + Chrome → 桌面办公用户;
– 窄屏(≤414px)+ Mobile + zh-cn → 移动端下沉市场用户;
– iPad + zh-cn + en-us → 双语教育/出海场景。


















