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를 통해 사용자와 통신합니다. 일어나고있는 일은
- 브라우저가로드 밸런서에서 포트 80을 요청합니다.
- 로드 밸런서는 웹 서버에서 포트 80을 요청합니다.
- 웹 서버가 사용자에게 리디렉션을 보냅니다
- 사용자가로드 밸런서에서 포트 443을 요청합니다.
브라우저가 리디렉션 루프를 감지하고 포기할 때까지 2-4 단계를 계속 반복합니다.
편집 :이 문제를 해결하려면 X-Forwarded-Proto 헤더가 http로 설정된 경우에만 다시 쓰기를 수행하십시오. 이 헤더는 Rackspace의로드 밸런서가 웹 서버에 요청을받은 프로토콜을 알려주는 방법입니다.