![为什么 nginx 在重写规则上改变 HTTP 方法?](https://linux22.com/image/606432/%E4%B8%BA%E4%BB%80%E4%B9%88%20nginx%20%E5%9C%A8%E9%87%8D%E5%86%99%E8%A7%84%E5%88%99%E4%B8%8A%E6%94%B9%E5%8F%98%20HTTP%20%E6%96%B9%E6%B3%95%EF%BC%9F.png)
每当我收到请求时,我都会使用以下重写规则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 浏览器真正这样做。但这样做的原因是为了保护用户免受各种劫持情况的侵害。
如果响应除 GET 或 HEAD 之外的请求而收到 301 状态代码,则用户代理不得自动重定向请求,除非用户可以确认,因为这可能会改变发出请求的条件。
注意:在收到 301 状态代码后自动重定向 POST 请求时,某些现有的 HTTP/1.0 用户代理会错误地将其更改为 GET 请求。
快速简便的解决方法是修复您的 Web 应用程序,使其停止提供需要重定向的 URL。这还将提高您网站的整体性能和 SEO 排名。例如,如果您重定向example.com
到www.example.com
全部您的 Web 应用程序提供的 URL 应以 开头www.example.com
。