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


13

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를 제거하고 싶다는 것입니다. 하나의 재 작성 으로이 작업을 수행 할 수 있습니까? 위의 다시 쓰기도 이것을 처리해서는 안됩니까?

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


로드 밸런서는 연결이 HTTPS인지 여부를 표시해야합니다. Rackspace에 문의하십시오. (아, 그리고 아마도 당신은 www를 제거하고 싶지 않을 것입니다 ...)
Michael Hampton

흥미 롭습니다. 왜 내가 www를 제거해서는 안된다고 생각합니까?
jwerre

답변:


14

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로 리디렉션하는 동안 무한 리디렉션 루프를 피해야합니다.


18

의 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


5
다시 쓰기를 통한 리턴을 사용해야합니다. 공감.
designermonkey

1
$host대신 사용할 수 있습니다$server_name
Yossi

server_name _에서 작동하지 않습니다. @Yossi가 제안한대로 $ host 변수를 사용해야합니다.
Razvan Grigore 2016 년

1

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

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

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

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


$ server_protocol이 항상 HTTP를 반환하는 이유를 설명 할 것입니다.
jwerre

그래서 왜 이런 일이 발생했는지 대답했습니다 ... 고치는 방법에 대한 제안?
jwerre
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.