2013-05-15 106 views
1

我有一箇舊的rails 2.3應用程序,我正在轉移到nginx + Passenger(來自Apache + Passenger)。 Nginx配置爲SSL並且似乎正常工作,除非我從Rails應用程序中陷入302重定向循環。太多的重定向:乘客+ nginx SSLRequirement

rails應用程序認爲請求不是ssl(request.ssl?必須評估爲false)。在production.log中,每個日誌條目都將請求顯示爲http。如果我禁用SSLRequirement插件,那麼重定向循環會消失。但是,我想確保我的Rails應用程序檢測到https請求,以便在創建絕對URL時正確設置協議。

我提到之前的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

這是不相關到你的問題,但你似乎不設置任何標準的代理標題例如「proxy_set_header X-Real-IP $ remote_addr; proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for; proxy_set_header Host $ 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 on;「線。

3

正如你猜你的Rails應用程序是不知道該請求是通過HTTPS完成。據to this page需要設置:

proxy_set_header X-Forwarded-Proto $scheme; 

爲了讓Nginx的穿過而計劃到Rails

但是他們設置的位置塊,你似乎沒有一個。

+0

這就是我需要使它與獨角獸一起工作的情況,因爲在這種情況下,nginx充當代理。我認爲這對乘客來說是不同的。 – Pierre

0

@ Danack的答案不會工作,因爲乘客不會作爲代理運行 - 它作爲模塊運行到nginx。相反,您可以使用passenger_set_cgi_param來僞造任何http標頭。

passenger_set_cgi_param HTTP_X_FORWARDED_PROTO $scheme; 

我不知道如果X轉發 - 協議現在是鐵軌的標準,但它與request.ssl?自動爲我工作在軌道上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