有没有办法过滤路由文件中不支持的格式?

时间:2009-10-06 23:17:47

标签: ruby-on-rails routing content-type

我有一个Rails应用程序受到ScanAlert调用/login.php的攻击,但该应用程序正在抛出500.我想过滤我的网站不支持的任何格式,而不是404。

我最初的倾向是在application_controller.rb中创建一个before_filter,它删除任何:不是的格式:html,:xml或:js,然后渲染404.

但是,最好在路由级别捕获不支持的格式。有没有人以这种方式接近它,你在路线文件中放了什么?

这似乎是一个常见的问题,但我找不到任何解决方案。

3 个答案:

答案 0 :(得分:1)

只是将路由映射到不存在的操作应返回404。

尝试将此添加到您的routes.rb

map.connect '/login.php', :controller => 'application', :action => 'devnull'

对于更通用的解决方案,将其添加到所有路径的末尾(这样做整齐地为读者练习(提示:with_options)):

:conditions => {:format => /js|html|xml/}

或来自另一方:

map.connect '/*whocares.php', :controller => 'application', :action => 'devnull' 

答案 1 :(得分:0)

如果一遍又一遍地使用相同的URL,则可能需要在生产服务器上添加Apache重写规则,以将URL映射到404页面,以便它永远不会触及Ruby。 Apache rewrite guide

答案 2 :(得分:0)

如果您使用的是宁静路线,则应该使用

respond_to do |format|
  format.html 
end

这将返回一个401(我认为),这不是一个会出现在你的日志中的错误,而是一个'无法识别的格式'(虽然我可能在确切的代码和消息上错了)。无论哪种方式,它都不需要在您的路由或您的apache设置中进行特殊配置,而是使用约定优于配置。

如果您的路线不安宁,那么您应该能够在路线的末尾添加:格式以使其有效,例如。

map.login '/login.:format', :controller => 'application', :action => 'login'

另外,请注意,尽量不要使用map.connect,而是使用命名路线,因为它们更清晰,并通过表达路线实际正在做什么来传达意义,尤其是在您的视图中。 (login_path比其堂兄{ :controller => 'application', :action => 'login' })更多,更清洁。

希望这有帮助。