NGX打印日志时对特殊字符的转码

在使用curl进行请求时,发现控制台与access.log中http_user_agent字段的日志显示不一致。问题源于日志打印过程中,x7F字符被解释为【删除】操作,导致字段值被截断。通过查看ASCII码表和源码分析,揭示了这个问题的原因。
摘要由CSDN通过智能技术生成
  • 问题:
    [root@3WR ~]# curl -svo /dev/null test/ -x 127.0.0.1:9711
    日志打印结果中http_user_agent不一致

1.控制台输出结果中打印0.9.

User-Agent: curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9. zlib/1.2.3 libidn/0.6.5

2.access.log中输出结果中打印0.9.8\x7F

127.0.0.1- - [01/Jul/2015:13:01:14 +0800] “GET http://localhost/HTTP/1.1” 200 30 “-” “curl/7.15.5(x86_64-redhat-li nux-gnu) libcurl/7.15.5 OpenSSL/0.9.8\x7F zlib/1.2.3 libidn/0.6.5”


  • 原因:
    先看下ASCII码表
八进制 十六进制 十进制 字符
177 7F 127 del

原因是\x7F字符被解释成【删除】 操作, 于是, 本来应该记录的 0.9.8, 删除一个字符后变成了0.9.
跟踪看下为什么access.log打印出了\x7F

Breakpoint 6, ngx_http_log_variable (r=0x7587e0, 
    buf=0x7436b8 "curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8\\x7F zlib/1.2.3 libidn/0.6.5\"\n07t", 
    op=0x740410) at src/http/modules/ngx_http_log_module.c:893
893     value = ngx_http_get_indexed_variable(r, op->data);
(gdb) p *value
/* escape = 1,内容是"0.9.8\177",\177和\x7F是一个东西
 都是符号del */
$16 = {len = 91, valid = 1, no_cacheable = 0, not_found = 0, escape = 1, 
  data = 0x76c13c "curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8\177 zlib/1.2.3 libidn/0.6.5"}

(gdb) bt
#0  ngx_http_log_variable (r=Unhandled dwarf expression opcode 0xf3
) at src/http/modules/ngx_http_log_module.c:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值