【问题标题】:In Rails, how to respond_to irrelevant non-http requests?在 Rails 中,如何响应无关的非 http 请求?
【发布时间】:2019-03-22 09:41:19
【问题描述】:

我有一个相对较大的网站,每天都会收到与各种 IP 地址无关的请求。一个常见的是example.com/home.zip

这会命中我的 Home 控制器,索引操作 {"controller"=>"home", "action"=>"index", "format"=>"zip"}。目前,它会导致 500 错误:

Missing template home/index, application/index with {:locale=>[:en], :formats=>[:zip], :handlers=>[:erb, :builder, :arb]}

我认为处理它的优雅方式是 404。我最接近的解决方案是:

respond_to do |format|
  format.html
  format.any { redirect_to :foo }
end

除了redirect_to :foo 我会做render file: "#{Rails.root}/public/404.html", status: 404。我在正确的轨道上吗?

【问题讨论】:

  • 为什么format.any 为什么不format.zip
  • @Pavan 因为只是一个例子,可能不仅仅是.zip,应用程序可能正在被某人扫描
  • @Pavan 正如@Vasfed 所说,format.zip 会解决我提到的具体错误,但是需要各种格式(json、jpeg 等)。
  • 好的,我明白了。在这种情况下,我会使用路由约束。检查guides.rubyonrails.org/routing.html#request-based-constraints

标签: ruby-on-rails ruby-on-rails-3 error-handling request response


【解决方案1】:

没有理由自己渲染404,你可以

 raise ActionController::RoutingError.new('Not Found')

对于这种情况,您还可以使路由约束更加困难,这样此类请求就不会到达控制器。

【讨论】:

  • 我尝试过像root to: "home#index", constraints: lambda { |req| req.format == :html } 这样的路由约束,但实际上什么也没发生。我仍然可以点击 /home.zip 并导致 500 错误。我在 index 操作中添加了一个 respond_to 块,仅使用 html 格式,现在在 localhost 中点击 /home.zip 会显示“无法访问此站点”并且 Rails 日志显示 Completed 406 Not Acceptable。这比 404 更好吗?
  • 406 更具描述性,但扫描脚本有可能只识别 200 和 404,其他的都被视为“嘿,我发现了一个漏洞,现在必须弄清楚如何利用”跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 2020-01-04
  • 2012-08-09
  • 2020-02-01
  • 2014-09-27
  • 1970-01-01
相关资源
最近更新 更多