2010-12-01 8 views
31

मैं कैसे सफाई करने के लिए मेरे ऐप की यूआरएल जानने के लिए देख रहा हूँ। मेरा ऐप हेरोकू पर रेल 3 द्वारा संचालित है।रेल - कैसे http://example.com से https://www.example.com पर रीडायरेक्ट करने के लिए

इच्छित URL https://www.example.comite.com

मुझे लगता है कि यूआरएल के लिए ऊपर के विपरीत किए गए सभी URL रीडायरेक्ट करना चाहते हैं है। क्या यह एक रेल चीज या डीएनएस है?

बुरा यूआरएल:

https://example.comite.com 
http://www.example.comite.com 
http://example.comite.com 

और अगर कुछ भी पीछे चल रही है यूआरएल के लिए http://www.example.comite.com/photo/1 की तरह, पथ के साथ पुनः निर्देशित किया करने के लिए: https://www.example.comite.com/photo/1

उत्तर

17

DNS रिकॉर्ड्स किसी डोमेन के लिए प्रोटोकॉल को परिभाषित नहीं कर सकता है, इसलिए आप http:// से https:// को DNS के माध्यम से रीडायरेक्ट नहीं कर सकते हैं। वेब सर्वर कॉन्फ़िगरेशन के माध्यम से ऐसा करना पोर्टेबल नहीं है, करना मुश्किल है, त्रुटि प्रवण और केवल सादा पुराना है। यह रेलवे राउटर द्वारा सबसे अच्छा काम है।

# beginning of routes.rb 
match "*path" => redirect("https://www.mysite.com/%{path}"), :constraints => { :protocol => "http://" } 
match "*path" => redirect("https://www.mysite.com/%{path}"), :constraints => { :subdomain => "" } 
+0

यह काम करता है, लेकिन क्या आपको ए रिकॉर्ड को जगह में छोड़ने की ज़रूरत है? मुझे लगता है कि आप 'mysite.com' को http: // www.mysite.com' पर DNS के माध्यम से रीडायरेक्ट करने में सक्षम होंगे, और फिर एक बार यह आपके रेल ऐप को दबाएगा, यह आपके मार्ग की बाधाओं का उपयोग करके https पर रीडायरेक्ट करेगा। हालांकि, मेरे DNS के साथ 'http: // mysite.com' रीडायरेक्ट को रीडायरेक्ट के रूप में रीडायरेक्ट किया गया है, लेकिन 'https: // mysite.com' नहीं है (और मार्ग की बाधाओं के प्रभावी होने के लिए मेरे रेल सर्वर को कभी हिट नहीं करता है)। मैं अब के लिए एक रिकॉर्ड रखने के लिए वापस आ गया है, लेकिन सिर्फ यह सोच रहा था कि क्या आपको पता था कि DNS पुनर्निर्देशन 'https: // mysite.com' के लिए क्यों काम नहीं करता था। –

+0

कुछ भी नहीं है जो आप DNS पक्ष पर कर सकते हैं। जैसा कि मैंने कहा, डीएनएस के पास प्रोटोकॉल से कोई लेना देना नहीं है। आप किसी नाम को दूसरे पर रीडायरेक्ट कर सकते हैं, लेकिन प्रोटोकॉल नहीं। यह DNS सर्वर पर भी प्रेषित नहीं है। आपका ब्राउज़र 'mysite.com' का आईपी पता 'http: // mysite.com' नहीं पूछता है, और इसे' रेडियरेक्ट www.mysite.com 'जैसे उत्तर मिलता है,' रेडियरेक्ट http: // www.mysite.com' – edgerunner

+0

मैं मार्गों में ऊपर नियमों को जोड़कर "https://example.com" से "https://www.example.com" पर रीडायरेक्ट करने में सक्षम नहीं हूं – Shrinivas

-5

अपने vhosts फ़ाइल में करते हैं।

एक एसएसएल vhost सेटअप करें।

आपके मानक पोर्ट 80 वर्चुअल होस्ट में। इसे कॉन्फ़िगर में जोड़ें:

Redirect permanent/https://www.mysite.com 

यह सभी पोर्ट 80 अनुरोधों को https पर अग्रेषित करेगा।

+4

वह Heroku उपयोग कर रहा है और उस तरह वेब सर्वर कॉन्फ़िगरेशन तक कोई पहुंच नहीं है। – theandym

7

क्योंकि यह हेरोकू है, आप अपाचे या nginx कॉन्फ़िगरेशन का उपयोग नहीं कर सकते हैं। आप क्या कर सकते अपने ApplicationController में एक before_filter डाल दिया जाता है, यह मानते हुए आप इन नीचे की तरह 3 या उससे अधिक नियंत्रकों हैं, हालांकि निश्चित रूप से वे अलग फ़ाइलों में हो जाएगा

class ApplicationController < ActionController::Base 
    def redirect_https   
     redirect_to :protocol => "https://" unless request.ssl? 
     return true 
    end 
    before_filter :redirect_https 
end 
class TypicalController < ApplicationController 
    def blah 
    end 
end 
class HomePageController < ApplicationController 
    skip_before_filter :redirect_https 
end 

आप भी अपने मार्गों थोड़ा बेला के लिए आवश्यकता हो सकती है जब devise का उपयोग करते हैं, लेकिन मुझे संदेह है कि था जिस तरह से हमने इसे किया था, इसलिए मैं उन विवरणों में शामिल नहीं होगा, और मैंने उस जटिलता से बचने के लिए उपरोक्त कोड संशोधित किया है।

खुश हैकिंग।

+0

यह जाने का सही तरीका लगता है, लेकिन इसका उत्तर नहीं है एक महत्वपूर्ण बिंदु: आप 'http: // mysite.com' से' https: // www.mysite.com' में कैसे बदलते हैं? (Http://stackoverflow.com/questions/9027916/redirecting-from-http-mysite-com-to-https-secure-mysite-com में अनिवार्य रूप से समान प्रश्न का उत्तर दें और डबल अंक मिलता है!) –

7

रेल 3.1.0 और उच्च एक नियंत्रक विधि है कि गैर विकास के वातावरण के लिए https पर रीडायरेक्ट करेगा जो force_ssl है।

एप्लिकेशन/नियंत्रक/application.rb:

class ApplicationController < ActionController::Base 
    # ... 
    force_ssl 
    # ... 
end 

यह

http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html

प्रत्येक नियंत्रक है कि आप अभी तक रीडायरेक्ट करने के लिए, या बेहतर, अपने ApplicationController में रखें चाहते में रखें यह हमेशा अपने ऐप्स में शामिल होना एक अच्छी बात है (और निश्चित रूप से आपको प्रमाणपत्र प्राप्त करना होगा)। हर जगह HTTPS!

+0

इस एसएसएल के खिलाफ की रक्षा करता है अलग करना? – stephenmurdoch

+1

मेरा मानना ​​है कि यह sslstrip-type हमलों के खिलाफ सुरक्षा करता है। रेल हमेशा संबंधित एचटीटीपीएस यूआरएल पर रीडायरेक्ट करके गैर-एसएसएल अनुरोधों को पूरा करने से इनकार कर देंगे। अगर sslstrip रीडायरेक्ट के प्रोटोकॉल को बदलता है, तो रेल बस फिर से HTTPS पर रीडायरेक्ट हो जाएंगे। –

+0

धन्यवाद @Robin_Daughtery – stephenmurdoch

8

आप हमेशा अपने production.rb में इस फेंक कर सकते हैं ...config.use_ssl = true

+3

रेल 5 (और संभवतः पुराने संस्करण भी) के साथ, 'use_ssl' कुछ भी नहीं करेगा। 'force_ssl' वह विकल्प है जिसे सेट किया जाना चाहिए। –

40

user2100689's answer के लिए एक विस्तार, रेल में 3+ आप config/वातावरण/production.rb में config.force_ssl = true उपयोग कर सकते हैं के रूप में

लाइन बस के रूप में uncommented किया जा सकता है इस प्रकार है

# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. 
config.force_ssl = true 
संबंधित मुद्दे