给定具有 proxy_pass 的以下位置,我想要记录完全合格的 uri。
location ~* ^/?(foo/?.*$) {
proxy_pass https://www.someserver.com/some-thing-else/$1;
break;
}
例如我想
https://www.originalserver.com/foo?page=5
重定向至
https://www.someserver.com/some-thing-else/foo?page=5
我相信这是有效的;我认为链中的其他东西正在删除 query_string。
因此,我希望将传递的内容准确输出到日志文件。我尝试了 $uri、$proxy_host 和 $upstream_addr,但找不到任何可以返回完全合格 uri 的东西
https://www.someserver.com/some-thing-else/foo?page=5
相反,我得到:
proxy_host: www.someserver.com
upstream_addr: 123.45.67.890:443
uri_path: /foo
uri_query: page=5
我对重写规则还很陌生,来自微软,所以我一直在阅读 nginx 的综合文档并在网上搜索,但我找不到答案。任何帮助都将不胜感激。谢谢。
附录:这是我在 7 条规则中遇到问题的唯一一条。
附录附录:这是我们当前的日志格式。
log_format json escape=json '{'
'"time_local": "$time_local",'
'"core": {'
'"site": "$server_name",'
'"server": "$host",'
'"dest_port": "$server_port",'
'"src_ip": "$realip_remote_addr",'
'"status": "$status",'
'"protocol": "$server_protocol",'
'"body_bytes_sent": "$body_bytes_sent",'
'"remote_addr": "$remote_addr",'
'"remote_user": "$remote_user",'
'"request": "$request",'
'"nginx_version": "$nginx_version",'
'"http": {'
'"http_referer": "$http_referer",'
'"http_user_agent": "$http_user_agent",'
'"http_x_header": "$http_x_header",'
'"uri_query": "$query_string",'
'"uri_path": "$uri",'
'"http_method": "$request_method",'
'"response_time": "$upstream_response_time",'
'"cookie": "$http_cookie",'
'"request_time": "$request_time",'
'"http_x_forwarded_for":
'"$http_x_forwarded_for",'
'"proxy_host": "$proxy_host",'
'"upstream_addr": "$upstream_addr"'
'}'
'}'
'}';```
答案1
要记录完整的请求 uri,您可以更改块log_format
内部的内容http
。将其更改为:
log_format main '$remote_addr - $remote_user [$time_local] "$host$request_uri" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
示例输出:
1.1.1.1 - - [02/Aug/2019:20:32:36 +0200] "www.website.eu/index.php?param=some_param" 200 1238 "https://www.website.eu/" "Mozilla/5.0" "-"