48.HTTP 规范规定,跟随重定向时必须使用 GET 方法

目录

起因:

概念


起因:

今天在练习一个Django功能时,把form的method设置为POST,但是实际提交时,一直是GET方法。最后,从下面这张图发现了端倪:

第一次是method是POST方法,被重定向时,变成了GET。

继续探索,从下图中可以看出来是和多语言相关,django前面的多语言设置,会自动加上语言的路径,从而有了重定向这个操作,把POST变成了GET。

如果想要继续采用现有的方式,实现多语言,有没有办法解决这个问题呢?解决方案在下面:

49.解决django多语言redirect时把post改为get的问题-CSDN博客

概念

根据HTTP规范(RFC 7231),当客户端(如浏览器)接收到一个带有状态码为3xx(重定向)的响应时,如果要跟随这个重定向到新的URL,它应该使用GET方法发起新的请求,即使原始请求使用的是POST或其他方法。


具体来说,RFC 7231的第6.4节阐述了这一点,它说明了对于诸如301(Moved Permanently)、302(Found,虽然现在推荐使用303 See Other来明确表示应使用GET)、307(Temporary Redirect)和308(Permanent Redirect)等状态码,客户端的行为应当遵循以下原则:

  • 对于301和302(以及历史遗留的使用方式),尽管早期实践中允许重定向POST请求并保持原方法,但现代实践和规范推荐在重定向时转换为GET请求,以避免潜在的副作用和不一致。
  • 303 See Other明确指示客户端应该使用GET方法重定向,不论原始请求是什么方法。
  • 307 Temporary Redirect和308 Permanent Redirect则保留了原始请求方法,但在实际应用中,特别是浏览器环境中,对于POST到307的重定向,虽然理论上可以保持POST方法,但实际操作中可能仍存在限制或实现差异。

因此,当一个POST请求被服务器响应以302 Found状态码时,浏览器或遵循HTTP规范的客户端会自动发起一个新的GET请求到Location头部指定的URL,而不是继续使用POST方法。这就是为什么在Django或其他Web框架中,处理POST请求后若直接返回重定向响应,原始的POST数据不会被传递到新的URL。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坐忘3GQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值