问题描述
nginx 日志"$request"字段以后,打印全是十六进制输出
log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘ ‘$status $body_bytes_sent "$http_referer" ‘ ‘"$http_user_agent" "$http_x_forwarded_for"‘;
解决办法
启用SSl支持
# 不同版本(nginx -v查看)的Nginx启用ssl的配置不一样!! # 版本1.15.0及以下 listen 443; ssl on; # 版本1.15.0以上 listen 443 ssl;
分析
对比一下http、https访问连接服务器过程:
http: TCP三次握手——发送请求数据——后台处理——返回结果
https: TCP三次握手——客户端发起https认证请求(第一步由client发送hello报文并带上相关信息)...
结论
在Nginx没有开启SSL支持的情况下,Nginx将https连接建立过程中的客户端hello报文当作http报文处理,暴力的截取了报文中指定位置的十六进制字符串当作了$request的http请求方法、URL和版本号,所以access日志中会出现十六进制字符串。
备注:
那为什么access日志中4个请求的$request开头部分是一致的,后面部分又不一致了呢?分析hello报文格式就知道了!
Nginx 日志打印十六进制 \x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03P\xBB