已 HTTP 重定向 HTTPS 为例:
301 Moved Permanently:该方式将所有的 HTTP 请求重定向到 HTTPS 上,并且该重定向是永久性的。客户端在收到 301 响应后,会自动将 HTTP 请求转为 GET 请求,同时将请求地址修改为重定向后的地址。这意味着,如果原始请求是 POST 请求,那么 301 重定向会将其转变为 GET 请求。此外,浏览器会缓存 301 响应,下一次请求时会直接跳转到 HTTPS 上。
302 Found / 303 See Other:这两种方式将所有的 HTTP 请求临时性地重定向到 HTTPS 上。 302 Found 的响应会将请求方法保持不变,同时将请求地址修改为重定向后的地址。而 303 See Other 则会将所有请求方法转变为 GET 方法,并将请求地址修改为重定向后的地址。这两种方式都不会缓存响应,下一次请求时会再次发起请求。
307 Temporary Redirect:该方式将所有的 HTTP 请求临时性地重定向到 HTTPS 上,并且会保留原始的请求方法。这意味着,如果原始请求是 POST 请求,那么重定向后的请求仍然是 POST 请求。同时,请求地址也会被修改为重定向后的地址。与 302 Found 类似,307 Temporary Redirect 不会缓存响应,下一次请求时会再次发起请求。
308 Permanent Redirect:该方式将所有的 HTTP 请求重定向到 HTTPS 上,并且该重定向是永久性的。客户端在收到 308 响应后,会自动将 HTTP 请求转为与原始请求方法相同的请求方法,同时将请求地址修改为重定向后的地址。与 301 Moved Permanently 不同的是,308 Permanent Redirect 不会允许浏览器将 POST 请求重定向到新地址。 308 响应也会被缓存,下一次请求时会直接跳转到 HTTPS 上。
-
nginx 配置 http 跳 https
if ($scheme = http) { return 301 https://$host$request_uri; }
- 如果状态码返回 301 或者 302,当 post 数据到 http 协议时,重定向后会出现请求方法变为 get,post 数据丢失。
- 解决这个问题就要换返回的状态码。
if ($scheme = http) { return 307 https://$host$request_uri; }
- 307 、 308 都可以保持 post 数据的重定向,包括请求方法也不会变化。
307 是临时,308 是永久 - 所以当往一个 http 地址发送 post 请求,服务器重定向到 https,要配置为 307 或者 308 状态码。