2013-01-03 8 views
13

かなり標準的な設定で、nginxにdjangoアプリに直面しています。私はdjangoアプリをSSLのみにしたいので、ポート80(HTTP)がポート443(SSL)にリダイレクトされると、nginx confに2つのlistenブロックがあります。これは期待どおりに動作しています。NginxでSSLポートに入ってきたSSL以外のトラフィックをリダイレクトすることができます

ポートフォワーディングがオンになっているVM内でこの設定を実行しています。ポート8080(HTTP)または8081(SSL)に移動してホストマシンからサイトをブラウズできます。再度、この作業は正常に動作します。

問題は、登録ワークフロー中にDjangoアプリケーションから内部的にリダイレクトされるときに発生します。 DjangoはSSLステータス(SSLはnginxで終了し、アプリケーションへのトラフィックはHTTP経由でポート5000で転送されます)が表示されることはありませんが、ポートは認識されるため、リダイレクトは無効になります**。

この結果はすべて、SSLポート上のnginxにトラフィックが送信されていることです。 http://127.0.0.1:443/。これを処理するためにnginxを設定する方法はありますか?

** NginxでX-Forwarded-Protoヘッダーを設定していて、Djangoが正しい.is_secure()値を取得しています。これは、is_secureをチェックせずにリダイレクトする特定の問題です着信URLスキーム。

[UPDATE 1]添付

は、関連するコンフィグ設定されています。これは、ポートフォワーディングを示す、Vagrantfile自体からです:

上記のポートフォワーディングの設定を使用して
config.vm.forward_port 80, 8080  # website, via nginx (redirects to SSL:8081) 
config.vm.forward_port 443, 8081 # website, via nginx (accepts SSL) 
config.vm.forward_port 5000, 8180 # website, via gunicorn (direct) 

、私はHTTPポート(8080)上のホストマシン上のサイトを参照している場合、その要求が受け入れられ、 nginx(下記参照)はこの要求をHTTPS(ポート8081で実行中)にリダイレクトします。 nginxのがあるとして、私はDjangoの混合スキーム&プロトコルから内部リダイレクトを取得するときに問題が発生し

(host) http://127.0.0.1:8080 -> forwarded to -> (guest vm) http://127.0.0.1:80 
(host) https://127.0.0.1:8081 -> forwarded to -> (guest vm) https://127.0.0.1:443 

、そして失敗しhttp:\\127.0.0.1:8081\...への要求、で終わる:私はHTTPSの午前たら、サイト自体が正常に動作します8081のトラフィックがSSLになると予想しています。

私が本当に欲しいのは、「SSLと非SSLの両方でリッスンし、非SSLをリダイレクトする」というルールです。

これは、関連nginxの設定です:

# Django app is served by Gunicorn, running under port 5000 (via Foreman) 
upstream gunicorn { 
    server 127.0.0.1:5000 fail_timeout=0; 
} 

server { 
    listen 80; 
    # 8081 is the port I am forwarding to on the host machine 
    rewrite^https://127.0.0.1:8081$request_uri? permanent; 
} 

server { 
    listen 443; 

    ssl on; 
    ssl_protocols  SSLv3 TLSv1; 
    ssl_ciphers   HIGH:!ADH:!MD5; 
    ssl_prefer_server_ciphers on; 
    ssl_certificate  /etc/nginx/ssl/self-signed.crt; 
    ssl_certificate_key /etc/nginx/ssl/self-signed.key; 

    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log; 

    location /static/ { 
     alias /app/static/; 
    } 
    location /media/ { 
     alias /app/media/; 
    } 
    location/{ 
     # everything else is to be served by the django app (upstream 'gunicorn') 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     # this is set to ensure that django is_secure returns True 
     proxy_set_header X-Forwarded-Proto $scheme; 
     proxy_set_header Host $http_host; 
     proxy_pass http://gunicorn; 
    } 
} 
+0

リダイレクトを使用してconfファイルの関連部分を投稿できますか? – ProfessionalAmateur

+0

オリジナルの投稿を設定と説明で更新しました。 –

答えて

20

あなたは、このドキュメントの「エラー処理」のセクションをチェックアウトする必要があります:

http://nginx.org/en/docs/http/ngx_http_ssl_module.html

非標準エラーコード497をするために使用することができますHTTPSポートに送信されたプレーンHTTPリクエストを処理します。 、

error_page 497 https://$host$request_uri; 

名前付きの場所もerror_pageで使用することができる詳細についてはhttp://nginx.org/r/error_pageを参照してください。このような

何かが(未テスト)動作するはずです。

+0

パーフェクト - まさに私が探していたもの。ありがとうございました。 –

+0

これは私のためにとても苦痛をもたらしました。そしてその解決はとても簡単です、ありがとうございます! – dotz

関連する問題