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

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

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

server_name mydomain.com;
rewrite ^(.*)$ $scheme://www.mydomain.com$1 permanent;

但是如果收到 POST 请求,它将被重定向为 GET。
为什么?重定向的正确方法是什么?

答案1

发生这种情况的原因是 Web 浏览器将 POST 请求更改为 GET 请求。

根据 RFC 2616,浏览器在收到 301 时不应该更改请求方法,而是警告用户并要求确认是否将请求重新提交到新 URL。不幸的是,我从未见过 Web 浏览器真正这样做。但这样做的原因是为了保护用户免受各种劫持情况的侵害。

参见第 10.3.2 节

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

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

快速简便的解决方法是修复您的 Web 应用程序,使其停止提供需要重定向的 URL。这还将提高您网站的整体性能和 SEO 排名。例如,如果您重定向example.comwww.example.com全部您的 Web 应用程序提供的 URL 应以 开头www.example.com

相关内容