我的应用程序曾经在 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
注意:如果您处理的是完整域而不仅仅是子域,请使用 :domain 而不是 :host。
以下解决方案在所有其他请求上返回 http 400 时重定向多个域GET
和HEAD
请求(根据类似问题中的此评论)。
/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
效果很好。
更现代的方法:
constraints(host: 'www.mydomain.com') do
get '/:param' => redirect('https://www.mynewurl.com/:param')
end
与其他答案类似,这个对我有用:
# config/routes.rb
constraints(host: "foo.com", format: "html") do
get ":any", to: redirect(host: "bar.com", path: "/%{any}"), any: /.*/
end
constraints(host: /subdomain\.domain\.com/) do
match '/(*path)' => redirect { |params, req|
"https://www.example.com#{req.fullpath}"
}, via: [:get, :head]
end
我在 Heroku 上使用自定义域时使用它,我想从 myapp.herokuapp.com -> www.example.com 重定向。