nginx上匹配特定请求,并打印日志

当遇到华为原生浏览器访问帖子页图片被防盗链拦截的问题时,通过在Nginx上自定义日志格式,利用map指令创建变量,过滤并打印特定请求,如/p/12345.jpg,以分析referer信息。发现华为旧版本浏览器未携带referer,升级后问题解决,同时其他如Nokia7Plus和GOME S1的部分浏览器也有类似问题。

背景:用户报障,在华为原生浏览器访问帖子页,图片会被防盗链拦截。而在其他浏览器不会有这个问题。

防盗链的设置跟referer相关。一开始想的是通过手机连接fiddler代理,观察图片请求带的referer是什么。但因为触屏版用了https,而同事手上能重现此问题的华为手机又死活安装不上fiddler的证书,所以没法通过fiddler来捕捉请求。

因为访问图片要先经过Nginx,所以想着在Nginx上打印出其中一张图片的访问请求,查看其referer。但因为访问量有点大,不适合打出所有访问日志。

解决方法:
0、自定义一个访问日志格式;
1、通过Nginx的map,创建一个变量$loggable。该变量默认值为0,只有$request为特定的请求时,其值才为1;
2、在server中配置access_log的时候,带上if=$loggable条件。

例:只打印出/p/12345.jpg的请求,具体配置如下:

0、自定义日志格式:

log_format mylogformat '"$remote_addr" "[$time_local]" "$request_method" '
                      '"$uri" "$request_uri" "$request_time" "$status" "$body_bytes_sent"'
                       '"$http_referer" "$http_x_forwarded_for" "$http_user_agent" "$upstream_status"'
                      '"$upstream_addr" "$upstream_response_time"';

1、使用map,创建并初始化变量:

map $request $loggable{
	default 0;
	~^GET\s/p/12345.jpg 1;    
}

2、在配置access_log时,通过该变量来判定是否应该打印日志:

server{
	.../*前面的部分*/
	
	access_log  /yourPathToAccessLogFile/access.log mylogformat if=$loggable;
	#mylogformat是步骤0创建的日志格式
	#access_log off;	//取消注释,就不打印访问日志了
	
	.../*后面的部分*/
}

3、保存并检查nginx.conf:

cd /pathToNginx/sbin/
./nginx -t

4、若检查没问题,则重启nginx:

./nginx -s reload

最后,发现 华为原生浏览器的旧版本,在请求图片时,的确没有带上referer。升级到最新版本后,这个问题应该已经消除了。

另外,还发现Nokia7Plus,GOME S1等手机上的部分浏览器也会有这个问题。

参考资料:

Nginx Map的使用

Nginx访问日志过滤

<think> 首先,用户的问题是:如何在nginx日志中查看请求路径?用户的查询基于提供的引用内容。 回顾系统级指令: - 所有行内数学表达式必须使用$...$格式,但这里没有数学内容。 - 独立公式必须使用$$...$$并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识如[^1]。 用户可见层的指令: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 - 参考站内引用:提供了引用[1]到[4]。 分析用户的查询:"我想查找在nginx日志中查看请求路径的方法 请问如何在nginx日志中查看请求路径"。核心是查看请求路径,这在nginx日志中通常通过日志格式中的变量来记录。 从引用中提取相关信息: - 引用[2]:讨论了Nginx日志格式,包括log_format指令。示例中提到了$request变量,它代表请求行,包含请求方法、URI和HTTP版本,因此URI就是请求路径。 - 示例:log_format main ... '$status $uptream_status $body_bytes_sent "$http_referer" ' ... 这里明确有"$request" - 引用[3]:提到了路径匹配日志配置的位置,强调不能在location结点配置日志,以防匹配错误时无日志输出。 - 引用[4]:展示了如何添加日志格式来记录POST请求日志,其中也包括$request变量。 - 引用[1]:是关于nginx日志分析的一般信息,但未直接涉及请求路径。 所以,关键点是使用$request变量在日志格式中记录请求路径(URI)。 我的回答应结构清晰: 1. 解释请求路径nginx日志中的表示。 2. 指导如何配置nginx来记录请求路径。 3. 提供示例配置。 4. 确保引用正确的来源。 5. 结尾生成相关问题。 步骤: 1. **介绍问题**:简要解释请求路径是什么和在日志中的作用。 2. **配置方法**: - 使用log_format指令定义日志格式,包括$request变量。 - 指定access_log指令来启用日志。 - 提到配置位置(如在http或server块)。 3. **示例**:给出一个简单的示例配置。 4. **参考引用**:在相关部分添加引用标识。 5. **生成相关问题**:在回答末尾添加。 回答语言:中文。 生成相关问题:基于主题,如: 1. 如何自定义nginx日志格式? 2. 如何处理nginx日志中的POST请求数据? 3. 如何分析nginx日志中的路径匹配错误? 4. 常见的nginx日志变量有哪些? 5. 如何优化nginx日志记录? 最终回答结构: - 开头回答用户问题。 - 逐步解释。 - 示例代码块(使用反引号)。 - 结尾添加相关问题。 </think> ### 如何在Nginx日志中查看请求路径Nginx日志中查看请求路径(即客户端请求的URI)主要通过配置日志格式来实现。请求路径通常存储在`$request`变量中,该变量记录完整的请求行(包括方法、URI和HTTP版本)。URI部分即为请求路径,例如`/index.html`或`/api/user`。以下是详细步骤,基于Nginx的官方文档和最佳实践,确保配置可靠有效。配置前请备份Nginx配置文件(通常位于`/etc/nginx/nginx.conf`),并确保Nginx具有写入日志文件的权限。 #### 步骤1: 配置日志格式以包含请求路径Nginx配置文件中,使用`log_format`指令定义日志格式,并包含`$request`变量来捕获请求路径。`$request`变量会自动记录请求的URI。配置应在`http`块或`server`块中设置,避免在`location`块中配置,以防路径匹配错误时日志缺失 [^3]。 - **推荐配置位置**:在`http`块中定义全局日志格式,或在`server`块中定义特定站点的格式(示例中使用`http`块以确保覆盖所有请求)。 示例配置: ```nginx http { # 定义日志格式,命名为main(可自定义名称) log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 指定日志文件路径并应用格式 access_log /var/log/nginx/access.log main; } ``` - **解释**: - `"$request"`:记录完整的请求行,如`"GET /index.html HTTP/1.1"`,其中`/index.html`就是请求路径。 - 其他变量(如`$remote_addr`记录客户端IP)可根据需要添加,但`$request`是核心。 - 日志文件路径`/var/log/nginx/access.log`可自定义,确保Nginx有写入权限。 #### 步骤2: 重启Nginx生效 修改配置后,需重启Nginx服务: ```bash sudo nginx -t # 测试配置语法是否正确 sudo systemctl reload nginx # 重新加载配置(或使用 restart) ``` 重启后,所有新生成的日志条目将包含请求路径。 #### 步骤3: 查看日志文件 使用命令行工具查看日志: ```bash tail -f /var/log/nginx/access.log # 实时查看日志 ``` 示例日志输出: ``` 192.168.1.1 - - [23/Oct/2023:10:30:00 +0800] "GET /api/data HTTP/1.1" 200 1234 "https://example.com" "Mozilla/5.0" ``` - 这里`"GET /api/data HTTP/1.1"`中的`/api/data`即为请求路径。 #### 注意事项 - **POST请求处理**:默认`$request`也记录POST请求路径。如需记录POST请求体(如表单数据),可添加`$request_body`变量(见引用[4]),但需注意安全风险(可能记录敏感信息)。 - **路径匹配调试**:如果路径涉及`location`块匹配问题(如404错误),建议在`server`块或更高层级配置日志,以确保错误请求被记录 [^3]。 - **自定义格式**:可通过添加更多变量细化日志,如`$uri`(仅URI路径)或`$document_uri`,但`$request`是最全面的方式 [^2]。 通过以上配置,您可以在Nginx日志中轻松查看和分析请求路径,用于网站流量分析、性能监控或调试路径匹配问题 [^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值