2015-12-21 61 views
5

目前我们正在面临处理HEAD和GET请求的问题。让我解释一下详细的场景在rails中处理HEAD和GET请求时的问题3

我们在我们的应用程序中集成了入站和出站SMS功能。

但是从最近2-3个月起,我们收到了来自SMS服务提供商的2-3次GET请求,它影响到我们的系统。

与短信服务提供商经过长时间的讨论,他们说“头部和GET请求从您的最终处理类似”

我还提到this link。你可以找到相应的日志在this link

所以任何一个可以建议如何解决这个问题。

编辑 经过研究,我们发现我们得到了HEAD和GET请求中的所有参数,因为这个服务器正在处理它。

+0

尝试类似这样: match'user/show'=>'users#show',:via => [:get,:head] –

+0

@ i-am-simple-user问题是什么?有更多的GET请求比平常?这会导致什么问题? –

+0

@ThongKuah基本上我使用的是heroku,它将HEAD请求视为GET。虽然我得到了HEAD,但它正在使用GET,并且它也向我显示GET不只是HEOG –

回答

1

我觉得问题可能是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 

所以基本上中间件改变请求方法路由器甚至会请求之前。 如果你希望你的路由器来处理头之间的区别和GET请求,您可以通过添加

config.middleware.delete "ActionDispatch::Head" 

您application.rb中

否则删除中间件,你应该能够访问该变量的像这样的控制器:

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

如果您担心性能,我建议编写自己的中间件来处理这些请求。 Railscasts在this上有几个good教程。

另请注意,其他中间件,如Rack :: Cache也可能会干扰此过程。所以,你应该将您的中间件之上:

config.middleware.insert_before 0, "YourMiddleware" 
+0

试过你的解决方案,但仍面临同样的问题 – Shrikant1712

+0

你试过了哪个解决方案?如果您尝试了中间件,并且它位于链的顶部,那可能意味着您的服务器(nginx,独角兽等)可能会将HEAD转换为GET请求。另外:你是否用curl做头部请求('curl -i -X HEAD [url]')?也许这个问题是在客户端。 – skahlert

0

我只想实现我自己:在https://stackoverflow.com/a/10453525/5446866

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处理

希望帮助

+0

我已经试过这个解决方案。 –

+0

是不是你想要的?即不同地响应'head'和'get'请求? –

+0

是的,基本上它不应该处理HEAD请求 –