我认为这不是一个非常困难的问题,但我使用了很多不同的解决方案而且并不知道最好的解决方案。
我正在使用Ruby on Rails并将我的应用程序放在Heroku上,我希望301将我的裸域(@)上的所有内容重定向到我的www域。 E.g。
http://domain.com - > http://www.domain.com http://domain.com/subpage - > http://www.domain.com/subpage
现在我通过首先删除@和www条目来处理我的DNS。然后我将整个网站的重定向设置为http://www.domain.com(为@和www重新创建DNS条目)。最后,我将我的www DNS条目更改为CNAME和heroku-app的名称(http://myapp.herokuapp.com)。
这似乎是将http://domain.com/subpage转发给http://www.domain.com(没有子页面)。
我现在正在寻找的是以简单/优雅的方式处理这个问题的正确/推荐方法。
DNS? 路线? 的.htaccess? (如果是这样,我如何改变RubyOnRails中的.htaccess)
提前致谢!
答案 0 :(得分:1)
答案 1 :(得分:1)
您的域名在哪里注册?如果使用GoDaddy,他们会提供一项服务,为您处理301重定向,但它要求您注册其中一个主机方案。成本最低(每月约5美元)。不是免费的,但是没有痛苦,不需要编码等。
答案 2 :(得分:1)
(注意:没有尝试过这个,但它应该有效)
有人可能认为 nice 方式是使用DNS或您的Web服务器功能来实现这一点。但是,如果需要,可以使用rails。
总而言之,它的优势在于,您可以轻松地保留任何参数/路径,就像您所说的那样。此外,逻辑在应用程序内部,如果您需要扩展/更改域名,则不会丢失。不好的一面是,只要有人使用裸域名,您的完整堆栈就会被点击。
您可以在应用程序控制器中尝试before_filter
:
before_filter :redirect_to_www
def redirect_to_www
redirect_to subdomain: 'www' unless request.subdomain == 'www'
end
如果您想避免“魔术重定向”并让每个人都清楚,在rails 3上您可以直接在路线中执行此操作:
constraints ->(request){ request.subdomain != 'www' } do
match '(*all)' => redirect( subdomain: 'www' )
end
您还应该将子域添加到默认的URL选项(应用程序控制器):
def default_url_options( option = {} )
{subdomain: 'www'}
end
答案 3 :(得分:0)
最后我要做的是将@ -DNS指向我的普通网络主机(因为@要求IP和Heroku只接受CNAME)和www-DNS到Heroku。
在我的普通虚拟主机上,我放了一个.htaccess,将所有流量重定向到我的www域,如下所示:
RewriteEngine On
### re-direct to www
RewriteCond %{HTTP_HOST} ^domain.com
RewriteRule (.*) http://www.domain.com/$1 [R=301,L]