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

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

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

但是,如果收到POST请求,它将被redirect为GET。
为什么? 什么是正确的方式来redirect呢?

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

根据RFC 2616,当接收到301时,浏览器不应该改变请求方法,而是警告用户并要求确认重新提交请求到新的URL。 不幸的是我从来没有见过一个网页浏 但是做这些的原因是保护用户免受各种劫持的情况。

参见10.3.2节 :

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

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

快速简单的解决方法是修复您的Web应用程序,以便停止提供需要redirect的URL。 这也将改善您的网站的整体performance和SEO排名。 例如,如果您将example.comredirect到www.example.com则Web应用程序提供的所有 URL都应以www.example.com开头。