type
status
date
slug
summary
tags
category
icon
password
在使用宝塔面板时,如果设置了反向代理访问面板,可能会遇到一个问题:面板无法记录用户的真实IP,只能记录到反代服务器的IP。
这是因为在反向代理的情况下,用户的真实IP会被隐藏在HTTP头信息中,而不是直接通过
request.remote_addr
获取。问题描述
原始的获取客户端IP的代码(约780行)如下:
这种方式只能获取到反代服务器的IP,而不是用户的真实IP。
解决方案
为了获取用户的真实IP,我们需要检查HTTP头信息中的
X-Forwarded-For
和 X-Real-IP
字段。这些字段通常由反向代理服务器添加,包含了用户的真实IP地址。以下是改进后的代码:
然后命令行重启宝塔面板即可
代码解释
- 获取初始IP地址:首先通过
request.remote_addr
获取初始IP地址,并去掉可能存在的::ffff:
前缀。
- 检查HTTP头信息:然后检查
X-Forwarded-For
和X-Real-IP
头信息。如果X-Forwarded-For
存在,取第一个IP地址(多个IP地址用逗号分隔);否则,如果X-Real-IP
存在,取其值。
- 验证IP地址:最后,通过
check_ip
函数验证IP地址的有效性。如果无效,返回 '未知IP地址'。
总结
通过上述改进,我们可以在宝塔面板设置了反向代理的情况下,正确记录用户的真实IP地址。这对于日志记录和安全审计非常重要。希望这篇博客能帮助到遇到同样问题的开发者。
Loading...