【问题标题】:Redirect PUT route to root_url automatically in routes.rb在 routes.rb 中自动将 PUT 路由重定向到 root_url
【发布时间】:2016-03-28 01:09:48
【问题描述】:

我当前正在运行的 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"

如何在路由文件中重定向它而不编写控制器来传递特定的 url 和重定向?

【问题讨论】:

    标签: ruby-on-rails routes


    【解决方案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。事实上,这最终可能会导致无限递归错误。

    我上面的代码仅适用于生产/登台(与您一样)。

    它采用通过GETPOSTPUT HTTP 动词的任何.txt 路由,重定向到根路径。

    【讨论】:

      【解决方案2】:

      知道了,只需将: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 请求。

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

      【讨论】:

        猜你喜欢
        • 2011-05-07
        • 1970-01-01
        • 2023-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        • 2017-03-18
        相关资源
        最近更新 更多