2017-01-05 16 views
6

Máy chủ của tôi chạy Django + Gunicorn + nginx.HttpResponseRedirect của Django là http thay vì https

Tôi đã thêm chứng chỉ SSL và cấu hình nginx để chuyển hướng http đến https. Khi nhận được yêu cầu https, nginx chuyển nó tới Gunicorn dưới dạng http.

Chương trình của tôi đôi khi trả về HttpResponseRedirect và trình duyệt nhận được phản hồi chuyển hướng và yêu cầu lại dưới dạng http, vì vậy nginx chuyển hướng đến https.

Làm cách nào để tránh điều này? Làm cách nào tôi có thể định cấu hình máy chủ để chuyển hướng đầu tiên trỏ trực tiếp đến URL https?

+0

Tôi thực sự làm điều tương tự. Hãy cho Nginx chuyển hướng tất cả yêu cầu http đến https và nó hoạt động retty tốt. – Jbertrand

Trả lời

5

Trong cấu hình nginx (bên trong khối location), chỉ định này:

proxy_redirect off; 
proxy_set_header X-Forwarded-Proto $scheme; 

Các proxy_redirect nói với nginx rằng, nếu phụ trợ trả về một chuyển hướng HTTP, nó nên để lại nó như là. Theo mặc định, nginx giả định backend là ngu ngốc và cố gắng thông minh; nếu chương trình phụ trợ trả lại chuyển hướng HTTP có nội dung là "chuyển hướng đến http://localhost:8000/somewhere", nginx sẽ thay thế nó bằng một cái gì đó tương tự như http://yourowndomain.com/somewhere ". Nhưng Django không phải là ngu ngốc (hoặc nó có thể được cấu hình để không ngu ngốc). biết liệu yêu cầu đã được thực hiện thông qua HTTPS hay HTTP đơn giản, nginx biết điều đó, nhưng yêu cầu sau đó nó làm cho phụ trợ Django luôn luôn là HTTP đơn giản.Chúng tôi nói nginx để vượt qua thông tin này với tiêu đề HTTP X-Forwarded-Proto, để chức năng Django liên quan chẳng hạn như request.is_secure() hoạt động đúng cách. Bạn cũng sẽ cần phải đặt SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') trong số settings.py.

+0

Tôi có cần thiết lập cả nginx và django hay chỉ cần đặt nginx? – permike

+0

Tôi không chắc chắn ý bạn là gì. Đặt cược tốt nhất của bạn sẽ là có chuyển hướng trả về django dưới dạng url tương đối, đó là "/ target" thay vì "http: // domain/target". –

+0

Tôi có nghĩa là sau khi tôi đặt nginx như những gì bạn nói, tôi cũng cần phải thiết lập django settings.py hoặc nó chỉ là một cải tiến cho các chức năng khác. Sau khi tất cả, bạn trả lời thực sự giúp, cảm ơn! – permike

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