Nginxは1128バイトを超えるヘッダー行を静かにドロップします


3

NginxをuWSGIアプリケーション(Djangoアプリ)のリバースプロキシとして設定しています。Djangoアプリがホストしているコンテンツの性質により、URLが長くなる場合があります。本当に長い。このため、RefererHTTPヘッダーも長くなる場合があります。

ここに問題があります。Nginxは、Referer1128バイトを超えると、クライアントから受信したものをドロップします(試行錯誤により発見)。1128バイト以下はすべてアップストリームサーバーに渡されます。より大きなものはすべてドロップされます。DjangoのCSRF保護メカニズムには無傷が必要なため、これは問題Refererです。

ここに私のNginx設定の関連セクションがあります。ファイル:

location / {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host              $host;
    proxy_set_header Referer           $http_referer;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

Nginxのドキュメントを調べましたが、クライアントヘッダーの最大長を制御する設定が見つかりませんでした。イライラして、私はNginxのソースコードを注ぐことさえ始めました。

NginxをReferer変更せずにアップストリームサーバーに渡すために何をする必要がありますか?

バージョン情報

  • Ubuntu 14.04サーバー64ビット
  • nginx / 1.4.6(Ubuntu)
  • uWSGI 1.9.17.1-debian
  • Django 1.7.0

バグに遭遇したようですね。すべてのバージョンを実行していますか?
マイケルハンプトン

@MichaelHampton:追加されました。
ネイサンオスマン14年

回答:


4

Xavierの答えとその後の議論は、この問題の本当の原因であるuWSGIに私を導きました。uWSGIがヘッダーを削除したようです。

[WARNING] unable to add HTTP_REFERER

ソリューションは非常にシンプルでした-uWSGIを起動するとき、私は単に次のオプションを含める必要がありました。

--buffer-size 8192

すべてのヘッダーがDjangoに到達し、CSRF検証が成功します。


1

Nginxヘッダーの読み取りサイズは、2つのディレクティブによって制御されます。

  • client_header_buffer_size [buffer_size] これはほとんどの場合に適合するデフォルトのバッファです

  • large_client_header_buffers [count] [buffer_size]これは、バッファーに収まらない場合にオンデマンドで割り当てられる追加client_header_buffer_sizeバッファーです。この最後のディレクティブをケースに合わせて調整buffer_sizeし、リクエストで渡されるどの行よりも大きいことを確認する必要があります(ヘッダー+ HTTPメソッドとHTTPバージョンのURL)。


私は設定client_header_buffer_size 16386;しましたlarge_client_header_buffers 4 16386;が、リクエストの合計長が4096バイト未満であっても、どちらも違いを生むようには見えません。
ネイサンオスマン14年

@NathanOsmanデバッグモードでログに何かありますか?400/431ステータスコードを取得しますか?
ザビエルルーカス14年

403 Forbiddenステータスコードが表示されます。これはアップストリームサーバーから送信されたものだと思います。403は、Refererヘッダーの内容を検証できないため、Djangoによってトリガーされます。
ネイサンオスマン14年

@NathanOsmanダミープロキシで簡単なテストを行いましたが、このようなことは何も起こりませんでした。完全な設定、curlリクエストとnginxへの応答、中間curlリクエストと上流ターゲットへの応答、およびデバッグモードでのログを投稿できますか?
ザビエルルーカス14年

1
ああ、いいキャッチ。詳細ログでuWSGIを実行すると、それが実際に犯人であることが明らかになります:「[警告] HTTP_REFERERを追加できません」。
ネイサンオスマン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.