关键是要用 Nginx 内置变量 $scheme(值为 http 或 https)在 log_format 中定义日志格式,再于 server 或 location 块中通过 access_log 启用;它由 TLS 握手状态直接确定,准确轻量,不依赖端口或代理头,是区分真实协议最稳妥的选择。

要在 Nginx 的 access_log 中记录客户端请求的协议类型(HTTP 或 HTTPS),关键不是额外安装模块,而是直接使用 Nginx 内置变量 $scheme —— 它会自动输出当前请求使用的协议,值为 http 或 https。
在 log_format 中加入 $scheme 变量
必须先在 http 块中定义一个包含 $scheme 的日志格式,不能直接在 access_log 行里写变量。例如:
log_format proto_log '$remote_addr - $remote_user [$time_local] "$scheme" "$request" ' '$status $body_bytes_sent "$http_referer" "$http_user_agent"';
这里 "$scheme" 会原样输出 http 或 https,位置可自由调整,比如放在 $request 前、后或单独成字段,便于后续解析。
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
在 server 或 location 中启用该格式
定义好格式后,在具体作用域中调用即可:
- 全局生效:在
server块中写access_log /var/log/nginx/access.log proto_log; - 仅对 HTTPS 站点记录:若该
server块监听 443 端口且配置了 SSL,则$scheme恒为https,但仍建议保留以保持日志一致性 - 区分混合协议站点:当同一域名同时支持 HTTP 和 HTTPS(如未强制跳转),
$scheme能准确反映用户实际访问方式
注意代理场景下的协议识别
如果 Nginx 前有负载均衡器或 CDN(如 AWS ALB、Cloudflare),客户端直连的是代理,Nginx 收到的原始请求可能是 HTTP,但真实协议需靠请求头判断:
- 检查
$http_x_forwarded_proto:多数代理会设置此头,值为http或https - 安全替代方案:用
map指令做逻辑映射,避免直接依赖不可信头 - 示例:
map $http_x_forwarded_proto $real_scheme {
default $scheme;
https https;
http http;
}
log_format proto_log '... "$real_scheme" ...';
验证与常见问题
重启 Nginx 后发起一次请求,查看日志是否出现预期协议字段:
192.168.1.100 - - [08/Jul/2026:08:29:15 +0000] "https" "GET /api/user HTTP/1.1" 200 124 "-" "curl/8.7.1"
若始终显示 http,请确认:
- 是否启用了 SSL 配置(listen 443 ssl)
- 是否遗漏了 ssl_protocols 等必要指令导致 HTTPS 握手失败而降级
- 代理是否正确透传 X-Forwarded-Proto 头

















