2010-06-19 19 views
7

के लिए सीएनएम रीडायरेक्ट के साथ हेरोकू पर कस्टम डोमेन सेट अप करना मैं हेरोकू का उपयोग कर रहा हूं, और मेरे ऐप के लिए कुछ कस्टम डोमेन जोड़े हैं, यानी myapp.com और www.myapp.comwww सबडोमेन

गोडाडी में मेरे DNS में तीन अलग-अलग हेरोोकू आईपी के लिए '@' के लिए तीन ए रिकॉर्ड हैं, और 'www' सबडोमेन के लिए एक सीएनएन है जो proxy.heroku.com पर इंगित करता है।

मैं जो करना चाहता हूं वह www.myapp.com से myapp.com पर किसी भी ट्रैफ़िक को रीडायरेक्ट कर रहा है। मैंने CNAME को '@' पर सेट करने का प्रयास किया, लेकिन यह अभी भी एक ही डोमेन पर बना हुआ है। क्या कोई तरीका है कि मैं इस रीडायरेक्ट को DNS स्तर पर मजबूर कर सकता हूं?

उत्तर

8

सीएनएन एक रीडायरेक्ट नहीं है बल्कि आपके डोमेन के लिए केवल एक कैनोलिक नाम है। इसका मतलब यह है कि यह उस डोमेन की तरह व्यवहार करता है जिस पर यह इंगित करता है (myapp.com आपके मामले में)। आपके ब्राउज़र को एक ही आईपी पता मिलता है क्योंकि myapp.com ने इसके लिए अनुरोध भेज दिया है।

रीडायरेक्ट HTTP स्तर या ऊपर पर किए जाते हैं। उदाहरण के लिए आप इसे अपने ऐप में कर सकते हैं या इसके लिए एक और सरल ऐप बना सकते हैं।

यहाँ एक सरल उदाहरण है अपने अनुप्रयोग में सीधे रीडायरेक्ट करना है:

# in your ApplicationController 
before_filter :strip_www 

def strip_www 
    if request.env["HTTP_HOST"] == "www.myapp.com" 
    redirect_to "http://myapp.com/" 
    end 
end 

या आप इस्तेमाल कर सकते हैं धातु रेल, जो भी ऐसा ही होगा, लेकिन बहुत तेजी से:

# app/metal/hostname_redirector.rb 
class HostnameRedirector 
    def self.call(env) 
    if env["HTTP_HOST"] == "www.myapp.com" 
     [301, {"Location" => "http://myapp.com/"}, ["Found"]] 
    else 
     [404, {"Content-Type" => "text/html"}, ["Not Found"]] 
    end 
    end 
end 

आप कर सकते थे मेजबाननाम के सामने www. के साथ सभी अनुरोधों से मेल खाने के लिए रेगेक्स का भी उपयोग करें।

1

और यहाँ Node.js

$ heroku config:set APP_HOST=yourdomain.com 

app.configure('production', function() { 
    // keep this relative to other middleware, e.g. after auth but before 
    // express.static() 
    app.get('*', function(req, res, next) { 
     if (req.headers.host != process.env.APP_HOST) { 
      res.redirect('http://' + process.env.APP_HOST + req.url, 301) 
     } else { 
      next() 
     } 

    }) 
    app.use(express.static(path.join(application_root, 'static'))) 
}) 

यह भी yourdomain.com को domain.herokuapp.com रीडायरेक्ट करेगा, खोज इंजन को रोकने अनुक्रमण डुप्लिकेट सामग्री के लिए एक समाधान है।

0

आप किसी भी रैक अनुप्रयोग में, rack-canonical-host मणि स्थापित करने और अपने रैक कॉन्फ़िग फ़ाइल में इस डाल कर बहुत आसानी से कर सकते हैं:

require 'rack-canonical-host' 
use Rack::CanonicalHost, 'myapp.com' 
+1

ग्रेट सुझाव है, लेकिन लगता है कि यह मणि एक में काम करेंगे है बहु-किरायेदार स्थिति जहां आपके ऐप को client1.com, client2.com, आदि का समर्थन करने की आवश्यकता है ... सही? – cman77

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