PATCH 方法被防火墙阻止?

PATCH method blocked by a firewall?

嗨,有人遇到过 XHR 上的 PATCH 方法(AJAX 请求)被防火墙阻止的情况吗?

基本上我们遇到过客户抱怨他无法更新我们应用程序上的内容的情况。我们在世界上任何地方都检查过它是否正常工作(我们通过 VPN 几个地方连接)

然后他们为我们提供了一个远程桌面(最新的 Windows,最新的 chrome),所以我们从他们的网络上为我们自己尝试了,他们是对的。通过 AJAX 调用的所有 PATCH 方法都以 405 结束,但所有 PUT POST DELETE GET 方法都很好。我们试图在应用程序和 Nginx 日志中跟踪这些 PATCH 请求,但它们似乎从未攻击过我们的服务器。所以结论是他们的防火墙更新让请求离开大楼。

正常:

| Laptop PATCH  ->  Clients Firewal   ->   Load Balancer   ->  Nginx proxy  -> Rails app (200 response) |

此防火墙案例:

| Laptop PATCH ->  Clients Firewal  (405 response)   |

由于没有时间对此进行调查,我们只是将其中一些有问题的端点从 PATCH 更改为 PUT,一切正常!

我唯一的解释是,因为 PATCH 是另一个(后来引入的)RFC 的一部分,所以他们的防火墙必须非常旧并且没有将 PATCH 注册为有效方法。他们的系统管理员不知道为什么会这样。但一个线索是应用程序是 EdTech,客户是学校 => 他们不一定在他们的网络堆栈上拥有最新的技术。也可以预置保姆软件。

对同一问题的 Reddit 讨论的交叉引用:https://www.reddit.com/r/rest/comments/5gkvba/patch_blocked_by_firewall/

仍然不太清楚为什么会这样,但我很确定这是因为 PATCH 方法比防火墙设置新。

基本上正确的解决方法是将 PATCH 替换为 POST,因为两者都是 non-idempotent.

HTTP 标准最佳实践告诉您不应将其替换为 PUT,尽管某些 web-frameworks(例如 Rails 上的 Ruby)使它变得太简单了。问题是,由于中间设备重复 PUT,因为它是幂等的,因此您最终可能会遇到其他问题。

我在文章 http://www.eq8.eu/blogs/37-post-create-and-put-updatepost

中总结了整个故事