在rails 3中处理HEAD和GET请求时发出问题

I-a*_*ser 5 ruby ruby-on-rails ruby-on-rails-3

目前,我们正面临处理HEAD和GET请求的问题.让我解释详细的情况

我们在我们的应用程序中集成了入站和出站SMS设施.

但是从过去的2-3个月开始,我们收到来自SMS服务提供商的2-3次GET请求,这对我们的系统产生了影响.

经过与SMS服务提供商的长时间讨论,他们说"从头到尾"处理"头部和获取请求"

我也提到了这个链接.您可以在此链接中找到相应的日志

那么任何人都可以建议如何解决这个问题.

编辑 经过研究,我们发现我们正在获取HEAD和GET请求中的所有参数,因为该服务器正在处理它.

ska*_*ert 2

我认为问题可能出在ActionDispatch::Head中间件上。其中一部分是以下代码:

def call(env)
  if env["REQUEST_METHOD"] == "HEAD"
    env["REQUEST_METHOD"] = "GET"
    env["rack.methodoverride.original_method"] = "HEAD"
    status, headers, _ = @app.call(env)
    [status, headers, []]
  else
    @app.call(env)
  end
end
Run Code Online (Sandbox Code Playgroud)

因此,本质上,中间件在路由器收到请求之前就改变了请求方法。如果您希望路由器处理 HEAD 和 GET 请求之间的差异,您可以通过添加来删除中间件

config.middleware.delete "ActionDispatch::Head"
Run Code Online (Sandbox Code Playgroud)

到您的应用程序.rb

否则,您应该能够在控制器中访问该变量,如下所示:

if request.env["rack.methodoverride.original_method"]=='HEAD'
  #do head processing here
  head :ok, :additional_header => 'value'
else
  #do get processing here
end
Run Code Online (Sandbox Code Playgroud)

如果您担心性能,我建议您编写自己的中间件来处理这些请求。Railscasts 有一些关于这方面的很好的教程。

另请注意,其他中间件(例如 Rack::Cache)也可能会干扰此过程。所以你应该在上面插入你的中间件:

config.middleware.insert_before 0, "YourMiddleware"
Run Code Online (Sandbox Code Playgroud)