2015-12-21 74 views
1

我目前正在运行的rails应用程序正在被黑客攻击的前WordPress网站的域中运行。每过一段时间,我都会收到一个PUT的路由错误通知,该网站没有,也不应该支持。显然,我无法阻止这些请求被做出,但我想优雅地处理它们。在routes.rb中自动将PUT路由重定向到root_url

在我的路线文件我已经把所有未知的路径重定向到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" 

如何在不写入控制器来传递特定url和重定向的情况下在路由文件中重定向这个?

回答

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。事实上,这可能最终导致无限的递归错误。

我上面的代码只能用于生产/分段(和你的一样)。

它通过任何.txt路由通过GET,POSTPUT HTTP动词,重定向到根路径。

1

你得到了它,只是改变:via选项[:put]

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

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

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