Chuyển hướng tất cả các yêu cầu http đằng sau Amazon ELB sang https mà không sử dụng nếu


27

Hiện tại tôi có ELB phục vụ cả http://www.example.orghttps://www.example.org .

Tôi muốn thiết lập nó để mọi yêu cầu trỏ đến http://www.example.org đều được chuyển hướng đến https://www.example.org .

ELB gửi các yêu cầu https dưới dạng yêu cầu http, vì vậy sử dụng:

server {
      listen         80;
       server_name    www.example.org;
       rewrite        ^ https://$server_name$request_uri? permanent;
}

sẽ không hoạt động vì các yêu cầu được gửi tới https://www.example.org vẫn sẽ được gửi đến cổng 80 trên nginx.

Tôi biết có thể viết lại thành

server {
      listen         80;
      server_name    www.example.org;
      if ($http_x_forwarded_proto != "https") {
          rewrite ^(.*)$ https://$server_name$1 permanent;
      }
}

Nhưng tất cả mọi thứ tôi đã đọc đều nói rằng ifnên tránh bằng mọi giá trong cấu hình nginx và điều này sẽ dành cho mọi yêu cầu. Ngoài ra, điều đó có nghĩa là tôi phải thiết lập một cấu hình riêng biệt để kiểm tra sức khỏe ( như được mô tả ở đây : "Khi bạn đứng sau ELB, nơi ELB đóng vai trò là điểm cuối HTTPS và chỉ gửi lưu lượng HTTP đến máy chủ của bạn, bạn phá vỡ khả năng đáp ứng với phản hồi HTTP 200 OK để kiểm tra sức khỏe mà ELB cần ").

Tôi đang xem xét đưa thông tin đăng nhập vào mã của ứng dụng web thay vì cấu hình nginx (và vì mục đích của câu hỏi này, giả sử đó là ứng dụng dựa trên Django), nhưng tôi không chắc liệu đó có phải là chi phí cao hơn không các if cấu hình trong.


Xin chào, bạn có thể vui lòng cho tôi biết bạn đặt những mã này ở đâu không?
YuAn Shaolin Maculelê Lai

@ YuAnShaolinMaculelêLai Chắc chắn. Đây là các tệp cấu hình cho nginx, vì vậy tôi chỉ cần đặt mã vào một tệp trong /etc/nginx/conf.d/. Tôi thường đặt tên tệp domainname.conf trong đó "domainname" là tên miền của trang web được đề cập. Bạn có thể đặt tên cho tệp bất cứ điều gì bạn muốn miễn là nó kết thúc bằng .conf.
Jordan Reiter

Cảm ơn nhiều. Tôi đã cố gắng tạo một tập tin mới theo sau .conf. Nhưng nó không làm việc cho tôi. Sau đó, tôi đặt mã trong tệp được tạo từ AWS trong /etc/nginx/conf.d/. Nó hoạt dộng bây giờ.
YuAn Shaolin Maculelê Lai

Câu trả lời:


9

Nếu nó hoạt động chính xác như thế, đừng sợ nó. http://wiki.nginx.org/ IfIsEvil

Điều quan trọng cần lưu ý là hành vi của if không nhất quán, được đưa ra hai yêu cầu giống hệt nhau, nó sẽ không ngẫu nhiên thất bại trên một và hoạt động khác, với thử nghiệm và hiểu đúng nếu có thể sử dụng ifs . Tuy nhiên, lời khuyên để sử dụng các chỉ thị khác khi có sẵn vẫn được áp dụng rất nhiều.


Trang này cũng nói rằng "nếu có vấn đề khi được sử dụng trong ngữ cảnh vị trí". Dường như với tôi rằng bạn có thể làm những gì bạn cần làm bên ngoài location {}, server {}thay vào đó. (Nhưng vui lòng cho tôi biết nếu điều này không chính xác!)
Excalibur

15
  1. Thiết lập ELB ELB ánh xạ ELB của bạn: 80 thành ví dụ: 80 và ELB: 443 thành ví dụ: 1443.
  2. Ràng buộc nginx để nghe trên cổng 80 và 1443.
  3. Chuyển tiếp yêu cầu đến cổng 80 đến cổng 443.
  4. Kiểm tra sức khỏe phải là HTTP: 1443. Nó từ chối HTTP: 80 vì chuyển hướng 301.

thiết lập elb els

Cài đặt NGINX

    server {
       listen         80;
       server_name    www.example.org;
       rewrite        ^ https://$server_name$request_uri? permanent;
    }

    server {
       listen         1443;
       server_name    www.example.org;
   } 

Những gì về cài đặt kiểm tra sức khỏe? bạn có thể vui lòng giải thích về điều đó là tốt.
samkhan13

điều này không hoạt động với kiểm tra độ sâu được đặt thành http: 80, kiểm tra sức khỏe không thành công.
samkhan13

2
Kiểm tra sức khỏe nên được HTTP:1443. Nó từ chối HTTP:80vì chuyển hướng 301.
cbron

điều này chủ yếu làm việc cho tôi nhưng dòng viết lại không hoạt động với miền ký tự đại diện của tôi. Bài đăng khác này đã sửa phần đó: serverfault.com/questions/447258/ trộm
Ron

9

Giải pháp này sử dụng logic có điều kiện, nhưng như câu trả lời được chấp nhận cho thấy, tôi cũng nghĩ rằng điều này là ổn. Tham chiếu: https://stackoverflow.com/questions/4833238/nginx-conf-redirect-multipl-conditions

Ngoài ra, điều này không yêu cầu mở bất kỳ cổng bổ sung nào trong cài đặt bảo mật aws cho hình ảnh. Bạn có thể chấm dứt ssl trong AWS LB và định tuyến lưu lượng https đến cổng http 80 trong trường hợp của bạn.

Trong ví dụ này, kiểm tra sức khỏe LB lượt truy cập / sức khỏe trên cổng 80 định tuyến đến máy chủ ứng dụng, vì vậy kiểm tra sức khỏe xác nhận cả nginx và ứng dụng của bạn đang thở.

server {
  listen 80 default deferred;

  set $redirect_to_https 0;
  if ($http_x_forwarded_proto != 'https') {
    set $redirect_to_https 1;
  }
  if ($request_uri = '/health') {
    set $redirect_to_https 0;
  }
  if ($redirect_to_https = 1) {
    rewrite ^ https://www.example.com$request_uri? permanent;
  }
  ...
}

1
phải có một cách thanh lịch hơn để làm điều này
Edward

0

Bây giờ bạn có thể tạo Trình nghe mới trong Cài đặt cân bằng tải AWS để chuyển hướng Cổng HTTP 80 sang Cổng HTTPS 443. Vì vậy, bạn không cần phải chạm vào cấu hình nginx / apache nữa.


thật không may, nó chưa được hỗ trợ trong Cloudform
Aryeh Leib Taurog
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.