【问题标题】:Is there a way to filter unsupported formats in the routes file?有没有办法过滤路由文件中不支持的格式?
【发布时间】:2010-12-04 10:58:44
【问题描述】:

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

我最初的想法是在 application_controller.rb 中创建一个 before_filter,它删除任何不是 :html、:xml 或 :js 的格式,然后呈现 404。

但是,最好在路由级别捕获不受支持的格式。有没有人这样处理过,你在路由文件中放了什么?

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

【问题讨论】:

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


    【解决方案1】:

    如果你使用的是宁静的路线,你应该会使用

    respond_to do |format|
      format.html 
    end
    

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

    如果您的路线不安静,那么您应该能够在路线的末尾添加一个 :format 以使其正常工作,例如。

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

    另外,请注意,尽量不要使用map.connect,而是使用命名路由,因为它们更简洁,并且通过表达路由实际在做什么来传达含义,尤其是在您的视图中。 (login_path 比它的表亲{ :controller => 'application', :action => 'login' } 说得更多,也更干净)

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      如果它一遍又一遍地使用相同的 URL,则可能值得在您的生产服务器上添加一个 Apache 重写规则,以将该 URL 映射到您的 404 页面,这样它就不会触及 Ruby。 Apache rewrite guide

      【讨论】:

        【解决方案3】:

        仅将路由映射到不存在的操作应该返回 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' 
        

        【讨论】:

        • 把 login.php 改成某种正则表达式,你就赢了。
        • 这适用于特定的 url 和格式,但是我指定 :html、:xml 和 :js 作为可接受格式的白名单解决方案呢?
        • 在上面添加了一个或两个替代解决方案。
        • 我不确定路由文件末尾的 :conditions => {:format => /js|html|xml/} 是否有效。如果文件中某处有 /login 路由定义,即使传入 /login.php,Rails 也会将其发送到 /login。也许黑名单解决方案是路由文件中的唯一方法。
        • map.connect '/*whocares.php', :controller => 'application', :action => 'devnull' 适用于我的应用程序,但我必须为每种格式创建一个在黑名单中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-10
        • 1970-01-01
        • 2017-08-15
        • 2019-09-21
        • 2022-01-01
        • 2016-07-08
        • 1970-01-01
        相关资源
        最近更新 更多