2013-05-15 2 views
1

나는 아파치 + 승객에서 nginx + Passenger로 이동하는 과정에있는 오래된 레일 2.3 앱을 가지고있다. Nginx는 SSL 용으로 구성되어 있으며 Rails 응용 프로그램에서 302 리디렉션 루프가 작동하지 않는 것을 제외하고 올바르게 작동하는 것으로 보입니다.너무 많은 리다이렉트 : passenger + nginx SSLRequirement

레일 앱은 요청이 ssl이 아니라고 생각합니다 (request.ssl?은 false로 평가되어야 함). production.log에서 각 로그 항목은 요청을 http로 표시합니다. SSLRequirement 플러그인을 사용하지 않으면 리디렉션 루프가 사라집니다. 그러나, 난 절대적 URL을 만들 때 프로토콜을 올바르게 설정할 수 있도록 내 레일 애플 리케이션이 https 요청을 감지하고 있는지 확인하고 싶습니다.

이전 Apache + Passenger 설정을 언급 한 유일한 이유는 SSLRequirement 플러그인이 해당 구성에서 제대로 작동하고 있다는 것입니다.

내 가상 호스트에 대한의 nginx의 설정은 다음과 같습니다

server { 
    listen  443 ssl; 
    server_name new.example.com; 
    root /home/user/railsapps/example-setup/public; 
    passenger_enabled on; 
    ssl_certificate /etc/nginx/ssl/2013/example.com.chained.crt; 
    ssl_certificate_key /etc/nginx/ssl/2013/example.key; 
    ssl_protocols  SSLv3 TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers   HIGH:!aNULL:!MD5; 
} 
+0

passenger_set_cgi_param HTTP_X_FORWARDED_PROTO $scheme; 

본인은 X-전달 - 프로토 이제 레일의 표준이면 모르겠지만, 레일에 나를 위해 request.ssl? 자동으로 작동 귀하의 질문에하지만 당신은 표준 프록시 헤더 중 하나를 설정하지 않는 것 같습니다 "proxy_set_header X-Real-IP $ remote_addr; proxy_set_header X-Forwarded-for $ proxy_add_x_forwarded_for; proxy_set_header 호스트 $ http_host;" 그것들을 설정하지 않으면 '흥분되는'행동을 일으킬 수 있습니다. – Danack

답변

0

대답은 여기에서 발견되었다 :

Error 310. Too many redirects with nginx + rails 3

단순히 다음에 설정을 변경해야

:

server { 
    listen 443; 
    ssl on; 
    server_name new.usfamilytree.com; 
    root /home/admin/railsapps/example-setup/public; 
    passenger_enabled on; 
    ssl_certificate /etc/nginx/ssl/2013/example.com.chained.crt; 
    ssl_certificate_key /etc/nginx/ssl/2013/example.key; 
    ssl_protocols  SSLv3 TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers   HIGH:!aNULL:!MD5; 
} 

내가 듣고 라인의 오프 SSL을 제거 "를 추가 에 SSL을; " 선.

3

당신은 당신의 레일 앱이 요청이 HTTPS를 통해 이루어집니다 인식하지 짐작한다. to this page 따르면 당신은 설정해야합니다

proxy_set_header X-Forwarded-Proto $scheme; 

은 위치 블록에서 설정 그러나 Nginx에이

을 레일을 통해 계획을 통과 얻으려면 당신은 일을하지 나타납니다.

+0

그게 내가 유니콘과 함께 작동하도록 만드는 데 필요한거야.이 경우에는 nginx가 프록시 역할을한다. 나는 그것이 승객을 위해 다르다라고 생각한다. – Pierre

0

승객이 프록시로 실행되지 않기 때문에 Danack의 대답은 작동하지 않습니다. nginx에 모듈로 실행됩니다. 대신, http 헤더를 passenger_set_cgi_param으로 가짜 만들 수 있습니다. 이것은 관련이 없습니다 4.

Docs here.

+2

승객 5.0.1에서'passenger_set_cgi_param'은 더 이상 유효하지 않습니다. (https://blog.phusion.nl/2015/03/04/phusion-passenger-5-0-1-released/) passenger_set_header'라고한다. – jwadsack

관련 문제