[server] 로드 밸런서 뒤에 ngnix를 사용하여 http를 https로 다시 작성

Rackspace로드 밸런서를 사용하여 관리자 패널 내에서 SSL 키 / pem을 설정할 수 있습니다. 모든 것이 잘 작동합니다 .http 및 https 프로토콜을 모두 사용할 수 있습니다. 그러나 다음을 사용하여 http를 https로 리디렉션하려고하면 :

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

… 리디렉션 루프가 발생합니다. 포트 443을 듣고 있지 않다는 것을 알고 있지만로드 밸런서가 나를 위해 처리했기 때문입니다. 나는 또한 재 작성을 if ($scheme ~* http){쓸모 없게 포장하려고했습니다 .

내 질문의 다른 부분은 URL에서 www를 제거하고 싶다는 것입니다. 하나의 재 작성 으로이 작업을 수행 할 수 있습니까? 위의 다시 쓰기도 이것을 처리해서는 안됩니까?

당신의 도움을 주셔서 감사합니다!



답변

SSL이로드 밸런서에서 오프로드 될 때 Rackspace의 Cloud Load Balancer가 X-Forwarded-Proto를 https로 설정 한 것이 정확합니다. nginx에서 경로 재 지정 루프를 피 location하려면 vhost 구성 의 섹션에 다음을 추가 할 수 있어야 합니다.

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

이것은 비 https 요청을 https로 리디렉션하는 동안 무한 리디렉션 루프를 피해야합니다.


답변

의 nginx를 사용하는 것은 서버 변수 내장 년대 $request_uri$server_name는 전혀 정규식을 사용하지 않고이 작업을 수행 할 수 있습니다. 서버 location블록에 다음을 추가하면 완료됩니다.

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

이는로드 밸런서가 $http_x_forwarded_proto요청과 함께 헤더를 백엔드 인스턴스 로 전송한다고 가정합니다 . 다른 일반적인 헤더에는 $http_x_forwarded_scheme$scheme.

자세한 내용은 nginx Pitfalls 및 일반적인 실수 문서 에서 확인할 수 있습니다 : https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites


답변

로드 밸런서는 항상 http를 통해 사용자와 통신합니다. 일어나고있는 일은

  1. 브라우저가로드 밸런서에서 포트 80을 요청합니다.
  2. 로드 밸런서는 웹 서버에서 포트 80을 요청합니다.
  3. 웹 서버가 사용자에게 리디렉션을 보냅니다
  4. 사용자가로드 밸런서에서 포트 443을 요청합니다.

브라우저가 리디렉션 루프를 감지하고 포기할 때까지 2-4 단계를 계속 반복합니다.

편집 :이 문제를 해결하려면 X-Forwarded-Proto 헤더가 http로 설정된 경우에만 다시 쓰기를 수행하십시오. 이 헤더는 Rackspace의로드 밸런서가 웹 서버에 요청을받은 프로토콜을 알려주는 방법입니다.


답변