2011-11-06 19 views
6

Herokuはクライアントからサーバーにプロキシ要求を行うため、発信IPアドレスを見つけるためにX-Forwarded-Forを解析する必要があります。Heroku上でwerkzeugを使用してipを取得するためのX-Forwarded-For

X-転送さ-用の一般的な形式は次のとおりです。

フラスコにWERKZEUGを使用して
X-Forwarded-For: client1, proxy1, proxy2 

、私はクライアントの発信元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. 

代わりに、あなたは(それを指摘してくれてありがとう@Bastian!)request.access_routeを使用することができます。

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

これは私がジャンゴに使用するものです。これを参照してくださいhttps://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_host

注:少なくとも、HTTP_X_FORWARDED_FORはIPアドレスの配列になります。最初のものはクライアントIPで残りはプロキシサーバーIPです。 settings.pyで

:あなたのviews.pyで

USE_X_FORWARDED_HOST = True 

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

関連する問題