【问题标题】:How to get the first client ip from X-Forwarded-For behind nginx + Gunicorn? [duplicate]如何从 nginx + Gunicorn 后面的 X-Forwarded-For 获取第一个客户端 IP? [复制]
【发布时间】:2016-02-22 11:02:42
【问题描述】:

用 nginx + Gunicorn 部署一个烧瓶应用程序,我需要从访问者那里获取真实的 ip。 (对于 Gunicorn 在 nginx 之后无法获取 REMOTE-ADDR)我尝试通过以下方式从 X-Forwarede-for 获取客户端 ip:

client_ip = request.headers.getlist("X-Forwarded-For")[0]

有时我会像这样正确获取 client_ip:

x-forwarded-for: 62.211.19.218

但有时我会像这样得到 client_ip 错误 - 结合代理 ip 地址(从一些不同的浏览器访问):

x-forwarded-for: 62.211.19.218, 177.168.159.85

nginx将两个ip地址转发给App时,如何只获取第一个客户端ip(没有代理地址177.168.159.85)?

【问题讨论】:

标签: python http nginx flask gunicorn


【解决方案1】:

一般X-FORWARDED-FOR形式如下:

X-Forwarded-For: client1, proxy1, proxy2, ...

但请记住,您不应该信任 X-Forwarded-For 或任何其他标头值,因为它们可以被不受信任的代理或其他东西操纵...

如果你使用nginx做反向代理,也可以查看request.environ['HTTP_X_REAL_IP']


编辑

根据flask documentationclient_ip = request.access_route[0] 将是您的答案。它将返回X-FORWARDED-FOR 中的IP 地址。检查这个wrekzeug/wrapper.py源代码

@cached_property
def access_route(self):
    """If a forwarded header exists this is a list of all ip addresses
    from the client ip to the last proxy server.
    """
    if 'HTTP_X_FORWARDED_FOR' in self.environ:
        addr = self.environ['HTTP_X_FORWARDED_FOR'].split(',')
        return self.list_storage_class([x.strip() for x in addr])
    elif 'REMOTE_ADDR' in self.environ:
        return self.list_storage_class([self.environ['REMOTE_ADDR']])
    return self.list_storage_class()

请注意,有些 http 服务器会将 localhost 或本地 IP 地址附加到 access_route 列表的第一项中。

【讨论】:

  • 问题是我试图通过 request.headers.getlist("X-Forwarded-For")[0], [0] 获得第一个 client1 ip表格,但有时它会先获得第一个 client1,然后是 proxy1。这样另一个 App 就无法分析这两个组合的 IP 字符串。是的,我已经通过request.environ.get['HTTP_X_REAL_IP']得到了,谢谢!
  • @rogwan 那你为什么不直接使用 split by , 分割结果呢?
  • @mromo 我试过这个:> client_ip = request.headers.getlist("X-Forwarded-For").split(',')[0] 但它不起作用......
  • 追加新答案,检查一下。同样在您的最后评论中,将getlist 替换为get 将起作用。
  • 完美!使用 'get' 而不是 'getlist' 效果很好,感谢您准确指出这个错误。
猜你喜欢
  • 2021-06-08
  • 2020-01-08
  • 2016-02-17
  • 2021-01-23
  • 2021-05-25
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
相关资源
最近更新 更多