301/302/303/307/308 的区别及使用场景

2024 年 10 月 19 日 261 点热度 0 人点赞 0 条评论

已 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 状态码。

Gcod

人生若只如初见,何事秋风悲画扇

文章评论