2012-05-03 22 views
19

मेरी nginx.conf में सर्वर घोषणा:प्रॉक्सी के पीछे रेल ऐप के लिए https पुनर्निर्देशन?

listen  1.2.3.4:443 ssl; 
    root /var/www/myapp/current/public; 
    ssl on; 
    ssl_certificate /etc/nginx-cert/server.crt; 
    ssl_certificate_key /etc/nginx-cert/server.key; 
    location/{ 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header Host $http_host; 
      proxy_redirect off; 

      if (!-f $request_filename) { 
      proxy_pass http://upstreamy; 
      break; 
      } 
    } 

nginx.conf में नदी के ऊपर घोषणा:

upstream upstreamy { 
    server unix:/var/www//myapp/shared/sockets/unicorn.sock fail_timeout=0; 
} 

इस ठीक काम करता है, MyApp https://somehost

के रूप में पहुंचा जा सकता है लेकिन एप्लिकेशन पैदा कर रहा है http यूआरएल रीडायरेक्ट के लिए है, इसलिए उदाहरण के लिए जब devise के साथ प्रमाणीकरण किया जाता है,/https के बजाय http://somehost/user/sign_in पर रीडायरेक्ट किया जाता है (रेल ऐप के दृष्टिकोण से, यह सभी http वैसे भी है)।

मैं

proxy_pass https://upstreamy; 

कोशिश की, लेकिन है कि बस nginx और इकसिंगों कि रेल अनुप्रयोग चलाने के बीच यातायात को एनक्रिप्ट करने की कोशिश करता है।

मैं भी कोशिश की application_helper.rb में:

# http://stackoverflow.com/questions/1662262/rails-redirect-with-https 
def url_options 
    super 
    @_url_options.dup.tap do |options| 
    options[:protocol] = Rails.env.production? ? "https://" : "http://" 
    options.freeze 
end 

लेकिन यह काम नहीं हो रहा है।

कोई इसे कैसे हल करेगा?

संपादित करें: इसलिए, लक्ष्य रेल ऐप को एसएसएल की आवश्यकता नहीं है, या एसएसएल का उपयोग करने के लिए मजबूर होना है; लक्ष्य रेल ऐप को https: // urls को पुनर्निर्देशित करते समय उत्पन्न करना है ... (मुझे लगता है कि अन्य सभी यूआरएल रिश्तेदार हैं)।

उत्तर

42

आप निम्न पंक्ति जोड़ने की जरूरत:

proxy_set_header X-Forwarded-आद्य https;

location/{ 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_set_header X-Forwarded-Proto https; 
     proxy_redirect off; 

     if (!-f $request_filename) { 
     proxy_pass http://upstreamy; 
     break; 
     } 
} 
+1

धन्यवाद, कि पूरी तरह से काम करता है! –

+0

बहुत बढ़िया! Nginx सेट अप बहुत दर्दनाक हो सकता है। बहुत दर्दनाक ... :) –

+0

मैं proxy_set_header का उपयोग नहीं कर सका, लेकिन मैंने बस "पोस्ट" विधि के लिए अपनी प्रॉक्सी में सब कुछ अग्रेषित किया और प्राप्त करने के लिए यूआरएल को फिर से लिखना। अभी तक बहुत अच्छी तरह से काम कर रहे हैं। – nembleton

-2

में के रूप में आप :protocol => "https" पारित कर सकते हैं, redirect_to करने के लिए।

आप application.rb को

Rails.application.routes.default_url_options[:protocol]= 'https' 

संदर्भ निम्न को जोड़कर एक डिफ़ॉल्ट के रूप में सेट कर सकते हैं: https://stackoverflow.com/a/6101147/446203

+0

यह एक विशिष्ट तैनाती विन्यास के लिए पारदर्शी और जोड़ों ऐप कोड नहीं है। – eprothro

संबंधित मुद्दे