Nginx 日志打印十六進制 \x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03P\xBB


問題描述

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM