在Rails 3中处理HEAD和GET请求时出现问题

5

目前我们在处理HEAD和GET请求时遇到了问题。让我详细说明一下情况。

我们已经在我们的应用程序中集成了入站和出站短信功能。

但是,在过去的2-3个月中,我们从SMS服务提供商那里收到了2-3次GET请求,这对我们的系统造成了影响。

在与SMS服务提供商进行了长时间的讨论后,他们说:“你们的头部和获取请求都是从你们的端口处理的。”

我还参考了此链接。 您可以在此链接上找到相应的日志记录。

所以,有人能建议如何解决这个问题吗?

编辑 经过研究,我们发现由于服务器正在处理所有参数,因此我们在HEAD和GET请求中都收到了所有参数。


尝试这样写: match 'user/show' => 'users#show', :via => [:get, :head] - Alexei.B
@i-am-simple-user 有什么问题吗?GET请求比平常多了吗?这会引起什么问题? - Thong Kuah
@ThongKuah 基本上我正在使用 Heroku,但它将 HEAD 请求视为 GET 请求。尽管我得到的是 HEAD,但它却将其视为 GET,在日志中也只显示 GET 而不是 HEAD。 - I-am-simple-user
你能否提供一下Heroku日志的样本?展示路由器和工作进程的行。 - bbozo
@bbozo,你可以在这里找到日志[http://pastebin.com/7HhpsCRi]。 - I-am-simple-user
2个回答

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

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

config.middleware.delete "ActionDispatch::Head"

将以下代码添加到你的application.rb文件中:

``` config.some_variable = "some value" ```

否则,你可以在控制器中通过以下方式访问该变量:

if request.env["rack.methodoverride.original_method"]=='HEAD'
  #do head processing here
  head :ok, :additional_header => 'value'
else
  #do get processing here
end

如果你担心性能问题,我建议你自己编写中间件来处理这些请求。Railscasts有一些很好的教程可以参考:Rack中间件自动完成搜索词汇
另外,请注意,其他中间件(例如Rack::Cache)也可能会干扰这个过程。因此,你应该将你的中间件插入到最顶部。
config.middleware.insert_before 0, "YourMiddleware"

尝试了您的解决方案,但仍然面临相同的问题。 - shrikant1712
你尝试过哪个解决方案?如果你尝试了中间件,并且它在链的顶部,那可能意味着你的服务器(nginx、unicorn等)会将HEAD转换为GET请求。另外:你用curl做过head请求吗(curl -i -X HEAD [url])?也许问题出在客户端。 - skahlert

0

我会按照https://dev59.com/SmPVa4cB1Zd3GeqP5m9t#10453525中的示例实现自己的 :head 响应。

if request.head?
 head :ok # or whatever
else
 # your other complex stuff here
end

你还可以添加一个特定于Head请求的路由。例如

match '/validate_messages/sms' => 'validate_messages#noop', via: :head

然后在你的控制器中

def noop
  head :ok
end

基本上,您必须使用 HEAD 请求实现您想要执行的操作,否则它将继续使用您的 GET 处理程序。

希望这有所帮助。


这不是你想要的吗?也就是说,对“head”和“get”请求做出不同的响应? - Rajesh Sharma
是的,基本上它不应该处理HEAD请求。 - I-am-simple-user
那个noop基本上什么也不做,只会返回一个200状态。 - Rajesh Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接