在routes.rb

时间:2015-12-21 21:19:38

标签: ruby-on-rails routes

我目前正在运行的rails应用程序正在一个已被黑客攻击的前wordpress网站的域上运行。每隔一段时间我就会收到一个PUT的路由错误通知,该网站不会也不应该支持。显然,我无法阻止这些请求,但我想优雅地处理它们。

在我的路线文件中,我已将所有未知路径重定向到root_url,如SO post on routing unknown requests中所述,代码为:

match '*path' => redirect('/'),via: [:get, :post]  unless Rails.env.development?

即使这样,我仍然会收到错误,如下所示:

ActionController::RoutingError: No route matches [PUT] "/cmyks42567.txt"

如何在路由文件中重定向此内容而不编写控制器以传递特定网址并重定向?

2 个答案:

答案 0 :(得分:1)

你知道了,只需将:via选项更改为[:put]

match '*path' => redirect('/'), via: [:put] unless Rails.env.development?

根据Rails指南(http://guides.rubyonrails.org/routing.html#http-verb-constraints):“你可以使用match方法和:via选项一次匹配多个动词:”你写它的方式只是匹配GET和POST请求。

更改后,您的代码按预期工作。

答案 1 :(得分:1)

我会亲自使用您的网络服务器软件来处理这个问题。

如果你正在使用Apache,你可以使用类似的东西:

#public/htaccess
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^*.txt$ http://example.com/ [R=301,L]

如果您想在Rails路线中处理它,您可以使用redirect

#config/routes.rb
unless Rails.env.development?
   scope constraints: { format: 'txt' } do
      match '*path', to: redirect('/'), via: [:get, :post, :put]
   end
end

但是,您必须确保仅捕获 您需要重定向的路由。

您的设置问题是,它会捕获您发送到应用的每条路线,并重定向到root。实际上,这可能最终导致无限递归错误。

上面的代码仅适用于生产/暂存(与您的相同)。

通过.txtGETPOST HTTP谓词传递的任何PUT路由都会重定向到根路径。