【发布时间】:2014-08-11 12:56:35
【问题描述】:
是否可以在我的路线中制定一个“catch all”重定向规则,例如这样的:
get "/foo*", to: redirect("/bar$1")
这将导致这些 301:
- /foo -> /bar
- /foo/baz -> /bar/baz
- /foo/?a=b -> /bar/?a=b
【问题讨论】:
标签: ruby-on-rails routes rails-routing
是否可以在我的路线中制定一个“catch all”重定向规则,例如这样的:
get "/foo*", to: redirect("/bar$1")
这将导致这些 301:
【问题讨论】:
标签: ruby-on-rails routes rails-routing
是的,你可以。以下是我之前的做法:
# config/routes.rb
def get_params_blob_if_present(params)
"/#{params[:a]}" if params[:a].present?
end
def get_query_string_params_if_present(params, options = {})
params = params.except(:a) # Don't include blob params
"?#{params.to_query}" if params.any?
end
MyApp::Application.routes.draw do
# ...
get '/foo(/*a)', to: redirect { |params, request| "/foo#{get_params_blob_if_present(params)}#{get_query_string_params_if_present(request.params)}" }
# ...
end
基本上,(/*a) 设置了一个名为 a 的 blob。然后,您可以有条件地将此 blob 中的参数包含在重定向 URL 中(如果存在)。同样,您可以有条件地在重定向 URL 中包含查询字符串参数(如果存在)。
【讨论】: