【问题标题】:Match request URL params with rails routes via recognize_path通过recognize_path将请求URL参数与rails路由匹配
【发布时间】:2020-11-27 13:51:00
【问题描述】:

我想通过recognize_path 像这样检查routes.rb 中是否确实存在任何传入请求作为条目

def path_exists?(path)
  Rails.application.routes.recognize_path(path)
  true
  rescue
   false
end

这适用于大多数 URL,但如果 URL 有参数,则无法识别它。

示例:

在 routes.rb 中,假设我有这样的条目

put "foo/bar/:param" => "foo#bar"

传入的请求 URL 格式为 /foo/bar/5

那么函数recognize_path不识别URL,因为参数的值是5但它与:param匹配

如何使用 recognize_path 或任何其他类似函数将具有参数的请求与其在 routes.rb 中的条目匹配?

原因

我正在使用 gem 过滤掉使用随机 URL(如 /dump.sql.tar.gz/conf.xz 等)攻击服务器的恶意尝试rack::attackthrottling 请求的 URL 不是 routes.rb 的一部分。因此出现了上述问题。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 security rack


    【解决方案1】:

    您可以使用以下 sn-p 来完成此操作:

    Rails.application.routes.routes.to_a.reduce(false) do |exists, route|
     route.path.to_regexp.match?(path) || exists
    end
    

    但我确实认为最好的选择是使用自定义逻辑处理 404 错误。为什么要做路由器已经为您做的事情?这是一个例子:

    config.exceptions_app = self.routes
    # This will route any exceptions caught to your router Rack app. Now you'll want to define routes to display those errors yourself:
    
    # config/routes.rb
    get "/404", :to => "errors#not_found"
    get "/422", :to => "errors#unacceptable"
    get "/500", :to => "errors#internal_error"
    

    (摘自http://web.archive.org/web/20141231234828/http://wearestac.com/blog/dynamic-error-pages-in-rails

    然后你可以在ErrorsController上做任何你想做的逻辑

    【讨论】:

    • 在进一步分析我们的应用程序如何处理错误后,我们似乎确实为它使用了自定义逻辑。无论如何感谢您的建议!我尝试使用您建议的代码 sn-p 并且在此过程中遇到了一些错误,但是以您的 sn-p 作为基础,我能够对其进行修改以获得所需的功能。此外,通过上面的 sn-p 向我介绍了ActionDispatch::Journey::Route 对象。感谢那。我将通过不同的逻辑输入对我有用的代码,但将其标记为答案,因为它肯定有帮助。再次感谢。
    【解决方案2】:
    def path_exists?(req_current)
     path_exists_val = false
     Rails.application.routes.router.recognize(req_current) do |route, params|
      if route.required_defaults[:controller] and route.required_defaults[:action]
       path_exists_val = true
      end
     end
     path_exists_val
    end
    

    这是我最终使用的代码,它使用ActionDispatch::Journey::Route 对象将所有可能的 URL 与其各自的控制器和操作相匹配,我从@cesartalves 中了解到该对象对问题的回答,因此将其标记为答案。

    欢迎提出任何改进代码的建议!

    PS。我是 Ruby on Rails 的新手。

    【讨论】:

    • 你好。在 stackoverflow 中,我们避免开放式问题和建议,我们只专注于为明确定义的问题提供答案。如果您需要有关代码的建议,您可能希望找到一个更开放的关于 Rails 的讨论论坛 :)
    猜你喜欢
    • 2020-04-19
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 2017-10-03
    • 2022-11-18
    • 2011-06-21
    • 1970-01-01
    • 2020-01-02
    相关资源
    最近更新 更多