2011-11-06 63 views
6

Heroku代理從客戶端到服務器的請求,因此您必須解析X-Forwarded-For以查找始發IP地址。解析X-Forwarded-爲了在Heroku上使用werkzeug獲得ip

的X轉發,對於一般格式爲:

X-Forwarded-For: client1, proxy1, proxy2 

使用WERKZEUG的燒瓶,我試圖拿出一個解決方案,以訪問客戶端的原始IP。

有沒有人知道一個很好的方法來做到這一點?

謝謝!

回答

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 
+1

你可能要檢查http://werkzeug.pocoo.org/docs/wrappers/#werkzeug。 wrappers.BaseRequest.access_route – Bastian

+0

@Bastian你發佈的鏈接說:「如果轉發的頭文件存在」,我知道這將是「X-Forwarded-For」,所以如果轉發的頭文件不存在,access_route函數將會工作,我不會有任何地方來測試我的燒瓶應用程序以外的英雄。 –

2

這是我在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'] 
+0

請閱讀[關於Heroku上唯一可靠的'X-Forwarded-For'中的最後一個IP的註釋](http://stackoverflow.com/a/18517550/429091)(除非您信任來自Heroku之外的客戶端不要對自己撒謊...... – binki