问题描述:
通过openresty的nginx接收到url get方式带参数请求之后,记录下相关参数的日志,发现中文全部被转成了十六进制。例如:xE6\xBC\x94\xE7\xA4\xBA\xE7\xAB\x99。
url这边参数是经过编码传输的,而nginx配置里url的参数已经经过解码。
当使用此方法:
local str = ngx.unescape_uri(url);
ngx.say(ngx.unescape_uri(str));
页面输出的是中文, 说明解码成功。
当使用此方法:
log_format webaccess "$u_a|$u_b";
location /test1 {
set_unescape_uri $u_b "中国";
set_unescape_uri $u_a $arg_pa;
log_subrequest on;
access_log /source/428/web/access.log webaccess;
}
access.log 日志里$u_a|$u_b 都转换成了 16进制。
网上搜索的解决办法有:
1.改编码
编辑conf下面的nginx.conf
在server段里加以下两行
default_type 'text/html';
charset utf-8;
然后重启。
这个方法没用。
2.参考博客https://www.jianshu.com/p/8f8c2b5ca2d1,
设置转义方式,这个方法我试过escape=none或者json都无效,应该是这个方法是针对nginx 1.11.8
以上版本
log_format postdata escape=json '$remote_addr | $request_body | $resp_body';
通过nginx -v命令得知,我安装的nginx版本是1.9.3的,
nginx version: openresty/1.9.3.1
3.针对我这个版本的nginx,采用以下方法可以解决:
直接在 nginx.conf的记录日志的location部分里面配置下面这一行就好了:
log_escape_non_ascii off;