HTTP 303 (SeeOther):GET 工作,POST 失败

Posted

技术标签:

【中文标题】HTTP 303 (SeeOther):GET 工作,POST 失败【英文标题】:HTTP 303 (SeeOther): GET Works, POST Fails 【发布时间】:2012-12-11 01:59:28 【问题描述】:

我正在尝试执行一个简单的操作:

    发布到 URL 返回 HTTP 303(参见其他) 从新网址获取

据我所知,这是一种非常标准的做法: http://en.wikipedia.org/wiki/Post/Redirect/Get

此外,SeeOther 似乎被设计为以这种方式工作: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4

我使用 web.py 作为我的服务器端控制器,但我怀疑这不是问题所在。如果我 GET,SeeOther 会按预期完美运行。如果我 POST 到同一个 URL,浏览器将无法重定向或加载任何内容。

认为这是浏览器问题,我尝试了 IE9 和 Google Chrome(v23 ish)。两者都有相同的问题。

考虑到 web.py 可能不正确地提供页面,或者生成错误的 URL,我使用 telnet 来检查标题。我发现了这个:

HTTP GET(在浏览器中有效):

GET /Users/1 HTTP/1.1
HOST: domain.com

HTTP/1.1 303 See Other
Date: Mon, 24 Dec 2012 18:07:55 GMT
Server: Apache/2
Cache-control: no-cache
Location: http://domain.com/Users
Content-Length: 0
Content-Type: text/html

HTTP POST(这在浏览器中不起作用):

POST /Users/1 HTTP/1.1
HOST: domain.com

HTTP/1.1 303 See Other
Date: Mon, 24 Dec 2012 18:12:35 GMT
Server: Apache/2
Cache-control: no-cache
Location: http://domain.com/Users
Content-Length: 0
Content-Type: text/html

另一件可能会影响工作的事情: 我正在使用 mod-rewrite 以便用户可见的 domain.com/Users/1 实际上是 domain.com/control.py/Users/1

我可能有更多信息/疑难解答,但我现在画的是空白。

问题:

为什么这适用于 GET 请求,而不适用于 POST 请求?我是否在某处缺少响应标头?

编辑:

使用 IE9 开发人员工具和 Chrome 的 Inspector,看起来 303 在 POST 后没有返回到浏览器。但是,当我执行 GET 请求时,我可以看到 303 进入。

但是,在更仔细地查看 Chrome 的 Inspector 之后,我看到了记录每个请求的能力(不清除每个页面调用)。这让我看到由于某种原因,我的 POST 请求看起来失败了。再次 - GET 工作正常。

【问题讨论】:

您在 Chrome Inspector 中看到了什么? 303收到客户端了吗?例如,如果您有重定向循环,Chrome 会在控制台中显示错误。 @JanusTroelsen 更新了问题以包含您的问题的答案。另外,这是我在这里的第一个问题,所以我不知道在评论中回答是否更合适?我认为在问题中添加更多细节会让未来的读者更容易...... 这样就好了。 POST 请求如何失败? 有趣...我尝试用正常的 200 + 正文中的一些文本来回应 POST。虽然这会在 IE9 中加载,但在 Chrome 中会超时。在加载或放弃之前,两者都需要大约 15 秒。我相信我刚刚发现了一个新问题哈哈 如果没有您在服务器端创建的代码,很难知道您的 POST 失败的原因。您能否发布针对您的帖子的服务器代码部分? 【参考方案1】:

这完全有可能不是你的问题,但由于你没有发布你的代码,我会试一试(以防万一)。

由于您使用的是 web.py,您的对象上是否定义了 POST 方法?

urls = (
    '/page', 'page'
)

class page:

    def POST(self):
        # Do something

    def GET(self):
        # Do something else

【讨论】:

我忘了更新这个问题 - 我发现问题不在于重定向。根本问题实际上是浏览器无法完全接收来自我的 webpy 应用程序的 POST 请求。我发现这个问题非常明显,因此我为它创建了另一个线程:***.com/questions/14132343/…

以上是关于HTTP 303 (SeeOther):GET 工作,POST 失败的主要内容,如果未能解决你的问题,请参考以下文章

常简状态码

前端面试必问的Http状态码以及代表的意义

http状态码

HTTP常见的状态码?

“302 Found”是啥意思?

http 状态码301、302、303、307、308 的区别