Đây là viết tắt của tôi nginx vhost conf:
upstream gunicorn {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
listen 80;
listen 443 ssl;
server_name domain.com ~^.+\.domain\.com$;
location / {
try_files $uri @proxy;
}
location @proxy {
proxy_pass_header Server;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 10;
proxy_read_timeout 120;
proxy_pass http://gunicorn;
}
}
Tuy nhiên, cùng một máy chủ cần phục vụ cả HTTP và HTTPS, khi ngược dòng phát sinh chuyển hướng (ví dụ: sau khi một biểu mẫu được xử lý), tất cả các yêu cầu HTTPS đều được chuyển hướng đến HTTP. Điều duy nhất tôi thấy rằng sẽ khắc phục vấn đề này là thay đổi proxy_redirect
như sau:
proxy_redirect http:// https://;
Điều đó hoạt động tuyệt vời cho các yêu cầu đến từ HTTPS, nhưng nếu chuyển hướng được phát hành qua HTTP, nó cũng chuyển hướng điều đó đến HTTPS, đó là một vấn đề.
Trong tuyệt vọng, tôi đã cố gắng:
if ($scheme = 'https') {
proxy_redirect http:// https://;
}
Nhưng nginx phàn nàn rằng proxy_redirect
không được phép ở đây.
Tùy chọn duy nhất khác mà tôi có thể nghĩ đến là xác định riêng hai máy chủ và proxy_redirect
chỉ đặt trên máy chủ SSL, nhưng sau đó tôi sẽ sao chép phần còn lại của conf (có rất nhiều trong server
chỉ thị mà tôi đã bỏ qua vì đơn giản). Tôi biết tôi cũng có thể sử dụng một include
chỉ thị để loại bỏ sự dư thừa, nhưng tôi thực sự muốn giữ chỉ một tệp conf mà không có bất kỳ sự phụ thuộc nào.
Vì vậy, trước tiên, có điều gì tôi đang thiếu sẽ phủ nhận vấn đề hoàn toàn không? Hoặc, thứ hai, nếu không, có cách nào khác (ngoài việc bao gồm một tệp bên ngoài) để xác định thông tin cấu hình dự phòng để tôi có thể tách ra các phiên bản HTTP và HTTPS của cấu hình máy chủ không?