在Heroku上使用werkzeug解析X-Forwarded-For获取IP

6 投票
2 回答
8116 浏览
提问于 2025-04-17 05:44

Heroku 是一个可以让你轻松部署应用的平台,它会把用户的请求从客户端转发到服务器。所以,你需要解析一下 X-Forwarded-For 这个字段,才能找到最初发起请求的用户的 IP 地址。

X-Forwarded-For 的一般格式是:

X-Forwarded-For: client1, proxy1, proxy2

我在用 Flask 的 werkzeug 库,想找个办法来获取客户端的原始 IP 地址。

有没有人知道好的方法呢?

谢谢!

2 个回答

3

这是我在Django中使用的内容。你可以查看这个链接了解更多信息:https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_host

注意:至少在Heroku上,HTTP_X_FORWARDED_FOR会是一个IP地址的数组。第一个是客户端的IP,后面的都是代理服务器的IP。

在settings.py文件中:

USE_X_FORWARDED_HOST = True

在你的views.py文件中:

if 'HTTP_X_FORWARDED_FOR' in request.META:
    ip_adds = request.META['HTTP_X_FORWARDED_FOR'].split(",")   
    ip = ip_adds[0]
else:
    ip = request.META['REMOTE_ADDR']
15

Werkzeug(还有Flask)会把请求头信息存储在一个叫做 werkzeug.datastructures.Headers 的东西里。你可以像这样使用它:

provided_ips = request.headers.getlist("X-Forwarded-For")
# The first entry in the list should be the client's IP.

另外,你也可以使用 request.access_route (感谢@Bastian提醒这一点!):

provided_ips = request.access_route
# First entry in the list is the client's IP

撰写回答