2017-07-03 12 views
3

djangoは、HTTP_X_FORWARDED_PROTOを無視するのはなぜですか?私はdjangoはテストからではなく、HTTP_X_FORWARDED_PROTOを無視しますか?

def testHttpSupport(self): 
    url = reverse('configuration-list') 
    response = self.client.get(url, HTTP_X_FORWARDED_PROTO='https') 
    cfg = response.data[0] 
    cfg_url = cfg['url'] 
    self.assertTrue(cfg_url.startswith('https')) 

場合、これが正常に動作することをテストするためのテストを行った

# make sure we know when we are secure when we are behind a proxy 
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') 

は私がのsettings.xmlに以下の設定を追加しました。戻りオブジェクトのURLはhttpsで始まります。

しかし、私がしようとした場合:

curl -v -H 'HTTP_X_FORWARDED_PROTO: https' http://localhost:8000/api/users/ 
... 
> GET /api/users/ HTTP/1.1 
> Host: localhost:8000 
> User-Agent: curl/7.51.0 
> Accept: */* 
> HTTP_X_FORWARDED_PROTO: https 
> 
* HTTP 1.0, assume close after body 
< HTTP/1.0 200 OK 
< Date: Mon, 03 Jul 2017 16:22:04 GMT 
< Server: WSGIServer/0.2 CPython/3.6.1 
< Content-Type: application/json 
< Allow: GET, POST, OPTIONS 
< Vary: Accept, Cookie 
< X-Frame-Options: SAMEORIGIN 
< Content-Length: 197 
< 
* Curl_http_done: called premature == 0 
* Closing connection 0 
[{"url":"http://localhost:8000/api/users/1/",... 

どうしてそれがHTTPSを:// 'を返していない私のユニットテストのようにベースのURL?

答えて

4

問題はヘッダー名です。 WSGIサーバを介してジャンゴにアクセスする場合は、あなたの代わりにHTTP_X_FORWARDED_PROTOX-Forwarded-Protoヘッダーを使用する必要があります。

メタ - :

curl -v -H 'X-Forwarded-Proto: https' http://localhost:8000/api/users/ 

WSGIプロトコルは、関連するCGI仕様が言った、従わなければならないと述べています'HTTP_'で始まる名前の変数には、使用するプロトコルがHTTPの場合は、クライアント要求のヘッダーフィールドから読み取られた値 が含まれています。 HTTPヘッダーフィールド名が大文字に変換され、 の「 - 」が「_」に置き換えられ、「HTTP_」が先頭に「 」というメタ変数名が付けられています。

source

ですから、WSGIサーバを使用している時はいつでもそれはジャンゴに渡される前に、X-Forwarded-Protoヘッダが自動的にHTTP_X_FORWARDED_PROTOに変換されます。代わりにHTTP_X_FORWARDED_PROTOヘッダーを渡す場合、HTTP_は依然として仕様に従って前に付ける必要があります。したがって、DjangoにはHTTP_HTTP_X_FORWARDED_PROTOというヘッダがあります。

self.clientはWSGIサーバーではなく、kwargsを介して渡された値はWSGI環境に直接処理されずに挿入されます。

CGI仕様CGIの仕様に従ってください**余分を経由して送信され

ヘッダ:だから、その場合のあなたは、変換を自分で行うと、実際にHTTP_X_FORWARDED_PROTOキーを使用する必要があります。たとえば、ブラウザからサーバーへのHTTP要求で送信された別の「ホスト」ヘッダーをエミュレートする場合は、HTTP_HOSTとして渡す必要があります。

source

関連する問題