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
config.middleware.insert_before 0, "YourMiddleware"
curl -i -X HEAD [url]
)?也许问题出在客户端。 - skahlert我会按照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
处理程序。
希望这有所帮助。