Nginx 日志打印十六进制 x16x03x01x02x00x01x00x01xFCx03x03PxBB

问题描述

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报文格式就知道了!

原文地址:https://www.cnblogs.com/Star-Haitian/p/14981070.html