我正在尝试执行一个简单的操作:
- 发布到 URL
- 返回 HTTP 303(参见其他)
- 从新 URL 获取
据我所知,这是一个非常标准的做法: 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 工作得很好。