首页 文章

在Heroku上设置自定义域,使用CNAME重定向为www子域[关闭]

提问于
浏览
7

我正在使用Heroku,并为我的应用添加了几个自定义域名,即 myapp.comwww.myapp.com .

我在GoDaddy的DNS有_333364_的三条A记录,指向三个单独的Heroku IP,以及指向 proxy.heroku.com 的'www'子域的CNAME .

我想要做的是将任何流量重定向到 www.myapp.commyapp.com . 我尝试将CNAME设置为'@',但仍然保留在同一个域中 . 有没有办法可以在DNS级别强制进行此重定向?

3 回答

  • 8

    CNAME不是重定向,只是您域名的规范名称 . 这意味着它的行为就像它指向的域(在你的情况下是myapp.com) . 您的浏览器获得与myapp.com相同的IP地址,并向其发送请求 .

    重定向在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
    

    或者你可以使用rails metal,它会做同样的事情,但要快得多:

    # 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')))
    })
    

    这也会将domain.herokuapp.com重定向到yourdomain.com,阻止搜索引擎索引重复内容 .

  • 0

    您也可以在任何Rack应用程序中轻松完成此操作,方法是安装 rack-canonical-host gem并将其放入Rack配置文件中:

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

相关问题