为什么 nginx 在重写规则上更改 HTTP 方法?

mar*_*igo 1 rewrite http nginx

每当我收到关于 的请求时mydomain.com,我都会www使用以下重写规则将其重定向到子域:

server_name mydomain.com;
rewrite ^(.*)$ $scheme://www.mydomain.com$1 permanent;
Run Code Online (Sandbox Code Playgroud)

但是如果收到一个 POST 请求,它会被重定向为 GET。
为什么?重定向此内容的正确方法是什么?

Mic*_*ton 5

这是因为 Web 浏览器正在将 POST 请求更改为 GET 请求。

根据 RFC 2616,当收到 301 时,浏览器不应更改请求方法,而是警告用户并要求确认重新提交请求到新 URL。不幸的是,我从未见过网络浏览器真正做到这一点。但这样做的原因是为了保护用户免受各种劫持场景的影响。

见第 10.3.2 节

如果收到 301 状态代码以响应 GET 或 HEAD 以外的请求,则用户代理不得自动重定向请求,除非用户可以确认,因为这可能会更改发出请求的条件。

注意:在收到 301 状态码后自动重定向 POST 请求时,一些现有的 HTTP/1.0 用户代理会错误地将其更改为 GET 请求。

快速简便的修复方法是修复您的 Web 应用程序,使其停止提供需要重定向的 URL。这也将提高您网站的整体性能和 SEO 排名。例如,如果您重定向example.comwww.example.com,然后所有的通过Web应用程序服务的URL应以开始www.example.com