用我的应用程序上运行foo.tld,但现在它运行在bar.tld。 请求仍将进来foo.tld,我想重定向他们bar.tld。
我怎样才能做到这一点的轨道路线?
用我的应用程序上运行foo.tld,但现在它运行在bar.tld。 请求仍将进来foo.tld,我想重定向他们bar.tld。
我怎样才能做到这一点的轨道路线?
这部作品在Rails的3.2.3
constraints(:host => /foo.tld/) do
match "/(*path)" => redirect {|params, req| "http://bar.tld/#{params[:path]}"}
end
这部作品在Rails的4.0
constraints(:host => /foo.tld/) do
match "/(*path)" => redirect {|params, req| "http://bar.tld/#{params[:path]}"}, via: [:get, :post]
end
这确实对方的回答的工作。 虽然另外,它保留查询字符串为好 。 (轨道4):
# http://foo.tld?x=y redirects to http://bar.tld?x=y
constraints(:host => /foo.tld/) do
match '/(*path)' => redirect { |params, req|
query_params = req.params.except(:path)
"http://bar.tld/#{params[:path]}#{query_params.keys.any? ? "?" + query_params.to_query : ""}"
}, via: [:get, :post]
end
注意:如果你处理的全域而不是仅仅子域,使用方法:域名来代替:主机。
下面的解决方案上重定向多个域GET
和HEAD
请求,同时(按照上所有其他请求返回HTTP 400 此评论在一个类似的问题)。
/lib/constraints/domain_redirect_constraint.rb:
module Constraints
class DomainRedirectConstraint
def matches?(request)
request_host = request.host.downcase
return request_host == "foo.tld1" || \
request_host == "foo.tld2" || \
request_host == "foo.tld3"
end
end
end
/config/routes.rb:
require 'constraints/domain_redirect_constraint'
Rails.application.routes.draw do
match "/(*path)", to: redirect {|p, req| "//bar.tld#{req.fullpath}"}, via: [:get, :head], constraints: Constraints::DomainRedirectConstraint.new
match "/(*path)", to: proc { [400, {}, ['']] }, via: :all, constraints: Constraints::DomainRedirectConstraint.new
...
end
出于某种原因, constraints Constraints::DomainRedirectConstraint.new do
没有为我在Heroku上,但工作constraints: Constraints::DomainRedirectConstraint.new
工作的罚款。