問題描述
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報文格式就知道了!