blank
blank
发布于 2019-11-16 / 1580 阅读 / 0 评论 / 0 点赞

POST 请求 被 nginx 301 后 变 GET

今天发现一个问题 由于 POST 请求 http://域名 nginx 配置了 301 https 后变成 GET 请求 导致 报错 405

WARN  15:00:20.867 [http-nio-8782-exec-7] o.s.web.servlet.PageNotFound - Request method 'GET' not supported

在全站支持HTTPS以后,用户可能还会使用http访问,所以很多建议使用301 Moved Permanently+HSTS( Strict Transport Security Policy)的方式要求用户跳转到HTTPS后再访问。

然而,对于有POST请求的域名是不适合用301 Moved Permanently的,关于post请求重定向用户确认的问题,实际上浏览器都没有实现;而且post请求的重定向应该发起post请求,这里浏览器也并不一定遵守,所以说HTTP规范的实现并未严格按照HTTP规范的语义。如下图所示。

所以这种情况,一个POST请求经过301后可能就变为GET请求。而很多服务端是对METHOD有严格限制的,万一限制只接受POST请求,对GET请求就会响应405错误,悲剧就产生了。

网上有说改成 307/308 的我试过不行

POST 请求应该直接 向 https://域名 发送请求即可解决此问题


评论