我想重定向www。版本到网站的非www版本,除非它是子域名。 (例如:将www.puppies.com重定向到puppies.com,但不要重定向www.cute.puppies.com)。
如何在保持完整请求路径的同时完成此操作? (例如:www.puppies.com/labradors转到puppies.com/labradors)
答案 0 :(得分:13)
在您的应用程序控制器中:
before_filter :redirect_subdomain
def redirect_subdomain
if request.host == 'www.puppies.com'
redirect_to 'http://puppies.com' + request.fullpath, :status => 301
end
end
正如@isaffe指出的那样,您也可以在Web服务器中重定向。
编辑:使用永久重定向状态(301)进行搜索引擎优化(如@CHawk所示)或307(如果是临时的)。
答案 1 :(得分:4)
为了完整起见,您可以使用导轨'路由配置使用request-based routing constraints
在Rails 4中执行此操作与使用应用程序控制器相比,这种方式具有较小的性能优势,因为请求不需要在Rails'处理过程中处理您的应用程序代码。路由中间件。
将以下内容放在路线文件(config/routes.rb
)
例如:
Rails.application.routes.draw do
# match urls where the host starts with 'www.' as long it's not followed by 'cute.'
constraints(host: /^www\.(?!cute\.)/i) do
match '(*any)', via: :all, to: redirect { |params, request|
# parse the current request url
# tap in and remove www.
URI.parse(request.url).tap { |uri| uri.host.sub!(/^www\./i, '') }.to_s
}
end
# your app's other routes here...
end
答案 2 :(得分:1)
在您的应用程序控制器中:
before_action :redirect_from_www_to_non_www_host
def redirect_from_www_to_non_www_host
domain_parts = request.host.split('.')
if domain_parts.first == 'www'
redirect_to(request.original_url.gsub('www.', ''), status: 301) and return
end
end
答案 3 :(得分:1)
如果您来自2018/2019,并且使用Rails 5 +
使用@noel的答案,但要更改:
before_filter
收件人:
before_action
答案 4 :(得分:0)
这可以通过多种方式实现。如果您使用nginx或apache来预读应用程序,请查看url rewrite。
在这里查看我的答案
Is it possible to redirect a url that uses HTTPS protocol? (Heroku, Rails)