9

SSLを使用してDjangoアプリをローカルでテストしようとしています。@login_requiredデコレータでビューがあります。したがって、を押す/lockerと、にリダイレクトされ/locker/login?next=/lockerます。これはhttpで正常に機能します。

ただし、httpsを使用すると、リダイレクトによって安全な接続が失われるため、次のようになります。https://cumulus.dev/locker -> http://cumulus.dev/locker/login?next=/locker

ページに直接移動するとhttps://cumulus.dev/locker/login?next=locker、安全な接続を介して正常に開きます。ただし、ユーザー名とパスワードを入力すると、に戻りますhttp://cumulus.dev/locker

Nginxを使用してSSLを処理し、SSLはと通信しrunserverます。私のnginx設定は

upstream app_server_djangoapp {
server localhost:8000 fail_timeout=0;
}

server {
listen 80;
server_name cumulus.dev;

access_log  /var/log/nginx/cumulus-dev-access.log;
error_log  /var/log/nginx/cumulus-dev-error.log info;

keepalive_timeout 5;

# path for static files
root /home/gaurav/www/Cumulus/cumulus_lightbox/static;

location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    if (!-f $request_filename) {
        proxy_pass http://app_server_djangoapp;
        break;
    }
}
}

server {
listen 443;
server_name cumulus.dev;

ssl on;
ssl_certificate /etc/ssl/cacert-cumulus.pem;
ssl_certificate_key /etc/ssl/privkey.pem;

access_log  /var/log/nginx/cumulus-dev-access.log;
error_log  /var/log/nginx/cumulus-dev-error.log info;

keepalive_timeout 5;

# path for static files
root /home/gaurav/www/Cumulus/cumulus_lightbox/static;

location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Ssl on;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    if (!-f $request_filename) {
        proxy_pass http://app_server_djangoapp;
        break;
    }
}
}
4

1 に答える 1

4

Djangoはプロキシの背後でのみプレーンHTTPで実行されているため、プロキシされたリクエストが元々HTTPSを介して行われたことを確認する方法を設定しない限り、常にそれを使用して絶対URL(リダイレクトなど)を構築します。

Django 1.4以降、設定を使用してこれを行うことができますSECURE_PROXY_SSL_HEADER。Djangoは設定されたヘッダーを確認すると、リクエストをHTTPではなくHTTPSとして扱いますrequest.is_secure()。trueを返し、https://URLが生成されます。

ただし、ドキュメントのセキュリティ警告に注意してください。プロキシが、HTTPとHTTPSの両方のすべての着信クライアント要求から信頼できるヘッダーを置き換えるか削除することを確認する必要があります。上記のnginx構成は、でそれを行わないためX-Forwarded-Ssl、スプーフィング可能になります。

これに対する従来の解決策は、各プロキシ構成に設定X-Forwarded-Protocolするhttpか、必要に応じて設定することです。https次に、以下を使用してDjangoを検索するように構成できます。

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
于 2012-07-20T02:29:10.883 に答える