2012-07-20 22 views
9

Tôi đang cố gắng thử nghiệm ứng dụng Django của mình tại địa phương bằng SSL. Tôi có một cái nhìn với trang trí @login_required. Vì vậy, khi tôi nhấn /locker, tôi được chuyển hướng đến /locker/login?next=/locker. Điều này làm việc tốt với http.Django @login_required bỏ https

Tuy nhiên, bất cứ khi nào tôi sử dụng https, chuyển hướng bằng cách nào đó giảm các kết nối an toàn, vì vậy tôi có được một cái gì đó giống như https://cumulus.dev/locker -> http://cumulus.dev/locker/login?next=/locker

Nếu tôi đi trực tiếp đến https://cumulus.dev/locker/login?next=locker trang mở ra tốt hơn một kết nối an toàn. Nhưng khi tôi nhập tên người dùng và mật khẩu, tôi quay lại http://cumulus.dev/locker.

Tôi đang sử dụng Nginx để xử lý SSL, sau đó trao đổi với runserver. nginx cấu hình của tôi là

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; 
    } 
} 
} 
+0

Tôi sẽ nói "Ồ, chỉ cần thay đổi' LOGIN_URL' trong tệp 'settings.py'" ... nhưng tôi đã thử nó không hoạt động. Câu hỏi hay. –

Trả lời

4

Django đang chạy trên HTTP đơn giản chỉ sau proxy, vì vậy nó sẽ luôn luôn sử dụng để xây dựng các URL tuyệt đối (như chuyển hướng), trừ khi bạn cấu hình nó như thế nào để thấy rằng các yêu cầu proxy là ban đầu được thực hiện qua HTTPS.

Kể từ Django 1.4, bạn có thể thực hiện việc này bằng cách sử dụng cài đặt SECURE_PROXY_SSL_HEADER. Khi Django thấy tiêu đề được định cấu hình, nó sẽ coi yêu cầu là HTTPS thay vì HTTP: request.is_secure() sẽ trả về true, các URL https:// sẽ được tạo, v.v.

Tuy nhiên, lưu ý cảnh báo bảo mật trong tài liệu: bạn phải đảm bảo rằng proxy thay thế hoặc loại bỏ tiêu đề đáng tin cậy từ tất cả yêu cầu của khách hàng đến, cả HTTP và HTTPS. Cấu hình nginx của bạn ở trên không làm điều đó với X-Forwarded-Ssl, làm cho nó trở nên giả mạo.

Giải pháp thông thường cho điều này là đặt X-Forwarded-Protocol thành http hoặc https, nếu phù hợp, trong từng cấu hình proxy của bạn. Sau đó, bạn có thể định cấu hình Django để tìm kiếm bằng cách sử dụng:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https') 
+0

Cảm ơn bạn! :) Tôi đã làm cho nó làm việc bằng cách sử dụng Gunicorn, nhưng tôi nhớ thiết lập các tiêu đề nhưng không thể sử dụng các thiết lập tiêu đề vì tôi vẫn còn trên 1,3! –

+0

@GauravDadhania bạn có nhớ cách bạn đã tìm ra điều này không? Tôi đang tìm cách trả lời http://stackoverflow.com/questions/29737089/how-do-i-use-a-login-redirect-with-https-in-django – YPCrumble

Các vấn đề liên quan