为什么Go http.Client中的POST请求不遵循301重定向?

为什么Go http.Client中的POST请求不遵循301重定向?,http,go,Http,Go,我正在用Go构建一个测试工具。该工具可以通过对端点执行POST请求来检索特定URL,该端点返回一个303,其中包含要测试的位置。有时,这个位置本身会被301重定向,我也想遵循301 Test tool -> POST /get-url-to-test -> 303 Location: /other -> GET /other -> 301 Location: /new-other (stops here because initial request is POST)

我正在用Go构建一个测试工具。该工具可以通过对端点执行POST请求来检索特定URL,该端点返回一个303,其中包含要测试的
位置。有时,这个位置本身会被301重定向,我也想遵循301

Test tool -> POST /get-url-to-test -> 303 Location: /other -> GET /other -> 301 Location: /new-other (stops here because initial request is POST)
正如我们在Go的源代码(第241到257行)中所看到的,GET请求似乎遵循301重定向,而不是POST请求:

为什么呢?这是HTTP规范的一部分吗?这是Go社区做出的决定吗

我问这个问题的原因是,在我的例子中,我必须手动执行一个新的GET请求,才能访问由
/other
重定向到的URL


编辑1:我之前犯了一个错误:
/other
资源正在由Go通过GET请求获取。但由于它返回一个301,并且最初的请求是一个POST,Go会停止在301上重定向。这似乎很奇怪。我错过什么了吗

编辑2:这可能是一个bug,我在Github上打开了一个问题:

HTTP说:

10.3重定向3xx

此类状态代码表示用户代理需要采取进一步的操作以满足请求。所需的操作可由用户代理执行 不与用户交互当且仅当 第二个请求是GET或HEAD


有趣。谢谢在进一步研究之后,我在问题中犯了一个错误:
/other
资源是通过一个
GET
请求通过Go获取的(源代码中的第341行)。所以我认为301也应该遵循,不是吗?这不再是标准行为:RFC2616已经过时,并已被RFC723x取代。看@Rick-777有趣,我必须通过RFC。同时,你能编辑答案并特别指出淘汰2616行为的引语吗?另请参见谢谢@nos。这很有趣。我不知道307的事。然而,这里的问题是Go不会重定向一个到达301的GET请求。这似乎很奇怪。如果您在303上发布帖子,Go会使用GET方法将您重定向到
位置
,但如果该
位置
本身返回301,则Go会停止重定向,即使我们是通过GET请求到达的。是,这似乎就是代码所做的——当在第302行执行重定向规则时,它会传入POST重定向规则(shouldRedirectPost)函数,该函数对于处理1是有意义的。重新使用但在第一次GET重定向之后,该规则也用于后续GET请求。我不知道这是否是故意的,但听起来像个bug。好的,谢谢你的反馈。我要报告一个错误。