Django 4中request.META['REMOTE_ADDR']失效原因咨询
Django升级后REMOTE_ADDR获取IP异常的原因解析
部署架构的反向代理影响
你的Django服务当前应该部署在反向代理(如Nginx、Apache)之后,客户端请求会先经过代理服务器再转发给Django。此时REMOTE_ADDR会被设置为代理服务器的IP(若代理与Django同服务器,就是127.0.0.1),而真实客户端IP会被代理服务器放在X-Forwarded-For请求头中传递给Django。如果旧版Django是直接暴露在公网接收请求、未经过反向代理,那当时REMOTE_ADDR自然能拿到真实客户端IP。Django版本的安全策略变更
从Django 1.10开始,官方加强了对代理请求头的安全处理,默认不会自动将X-Forwarded-For中的IP替换到REMOTE_ADDR中。旧版Django 1.9没有这类严格限制,在部分部署场景下能直接通过REMOTE_ADDR拿到真实IP,但新版本为了防止恶意请求伪造代理头,必须明确配置信任的代理来源,才会正确解析真实IP到REMOTE_ADDR。关于
HTTP_X_FORWARDED_FOR的注意事项
直接读取HTTP_X_FORWARDED_FOR虽能拿到IP,但存在被伪造的风险。正确的做法是在Django配置中添加信任的代理信息:- 设置
ALLOWED_HOSTS包含代理服务器的IP或域名 - 配置
SECURE_PROXY_SSL_HEADER(如SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https'))来识别代理传递的协议 - Django 4.0+可直接使用
request.get_client_ip()方法,该方法会自动根据配置的信任代理解析真实IP,比手动读取请求头更安全。
- 设置
内容的提问来源于stack exchange,提问作者Ljubisa Livac
相关产品推荐
相关产品推荐

