viết lại http thành https với ngnix phía sau bộ cân bằng tải


13

Tôi đang sử dụng bộ cân bằng tải Rackspace cho phép tôi thiết lập khóa ssl / pem bên trong bảng quản trị. Mọi thứ đều hoạt động tốt, tôi có thể sử dụng cả giao thức http và https. Nhưng nếu tôi cố chuyển hướng http sang https bằng cách sử dụng:

server{
  listen *:80;
  server_name mydomain.com www.mydomain.com; 
  rewrite ^ https://mydomain.com$request_uri? permanent;

... Tôi nhận được một vòng lặp chuyển hướng. Tôi nhận ra tôi không nghe cổng 443 nhưng đó là vì bộ cân bằng tải đã xử lý việc đó cho tôi. Tôi cũng đã thử gói lại việc viết lại if ($scheme ~* http){nhưng không có kết quả.

Phần khác của câu hỏi của tôi là tôi muốn xóa www khỏi url, tôi có thể làm điều này với một lần viết lại không? Không nên viết lại ở trên cũng quan tâm đến điều này?

Cảm ơn bạn đã giúp đỡ!


Bộ cân bằng tải sẽ gửi một số dấu hiệu cho bạn biết liệu kết nối có phải là HTTPS hay không. Hỏi Rackspace. (Ồ, và có lẽ bạn không muốn thoát khỏi www ...)
Michael Hampton

Thú vị, tôi sẽ xem xét điều đó. Tại sao bạn nghĩ tôi không nên thoát khỏi www?
jwerre

Câu trả lời:


14

sciurus là chính xác trong đó Bộ cân bằng tải trên đám mây của Rackspace đã đặt X-Forwarded-Proto thành https khi SSL được giảm tải ở bộ cân bằng tải. Để tránh vòng lặp chuyển hướng trong nginx, bạn có thể thêm phần sau vào locationphần trong cấu hình vhost:

if ($http_x_forwarded_proto = "http") {
            rewrite  ^/(.*)$  https://mydomain.com/$1 permanent;
}

Điều này sẽ tránh vòng lặp chuyển hướng vô hạn trong khi chuyển hướng các yêu cầu không phải https sang https.


18

Bằng cách sử dụng các biến máy chủ tích hợp của nginx $request_uri$server_namebạn có thể thực hiện việc này mà không cần sử dụng các biểu thức thông thường. Thêm phần sau vào locationkhối máy chủ của bạn và bạn đã hoàn tất:

if ($http_x_forwarded_proto = "http") {
    return 301 https://$server_name$request_uri;
}

Điều này giả định rằng bộ cân bằng tải của bạn đang gửi $http_x_forwarded_prototiêu đề cùng với yêu cầu đến (các) thể hiện phụ trợ của bạn. Các tiêu đề phổ biến khác bao gồm $http_x_forwarded_schemevà cũng chỉ $scheme.

Thông tin chi tiết có thể được tìm thấy trong tài liệu Cạm bẫy và sai lầm thường gặp : https://www.nginx.com/resource/wiki/start/topics/tutorials/config_pit thác / # taxing-throwrites


5
Chắc chắn nên sử dụng trở lại viết lại. Nâng cao.
designermonkey

1
Bạn có thể sử dụng $hostthay vì$server_name
Yossi

không hoạt động với server_name _; vì vậy người ta nên sử dụng biến chủ $ như @Yossi đề xuất.
Razvan Grigore

1

Bộ cân bằng tải luôn nói chuyện với bạn qua http. Những gì đang xảy ra là

  1. Trình duyệt đưa ra yêu cầu tới cổng 80 trên bộ cân bằng tải
  2. Bộ cân bằng tải đưa ra yêu cầu tới cổng 80 trên máy chủ web của bạn
  3. Máy chủ web của bạn gửi chuyển hướng đến người dùng
  4. Người dùng đưa ra yêu cầu tới cổng 443 trên bộ cân bằng tải

Các bước 2-4 cứ lặp đi lặp lại cho đến khi trình duyệt phát hiện vòng lặp chuyển hướng và bỏ cuộc.

EDIT: Để giải quyết vấn đề này, chỉ thực hiện viết lại khi tiêu đề X-Forwarded-Proto được đặt thành http. Tiêu đề đó là cách bộ cân bằng tải của Rackspace nói với máy chủ web của bạn giao thức mà nó nhận được yêu cầu.


Tôi đoán điều đó sẽ giải thích tại sao $ server_protatio luôn trả về HTTP
jwerre

Vì vậy, bạn đã trả lời tại sao điều này xảy ra ... bất kỳ đề xuất về cách khắc phục?
jwerre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.