HTTP 303 (SeeOther): GET Works, POST Fails

2019-02-26 01:29发布

问题:

I am trying to perform a simple action:

  1. POST to a URL
  2. Return HTTP 303 (SeeOther)
  3. GET from new URL

From what I can tell, this is a pretty standard practice: http://en.wikipedia.org/wiki/Post/Redirect/Get

Also, it would seem that SeeOther is designed to work this way: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4

I'm using web.py as my server-side controller, but I suspect that it's not the issue. If I GET, SeeOther works flawlessly as expected. If I POST to the same URL, the browser fails to redirect or load anything at all.

Thinking it was a browser issue, I tried both IE9 and Google Chrome (v23 ish). Both have the same issue.

Thinking web.py might be serving the page incorrectly, or generating a bad URL, I used telnet to examine the headers. I found this:

HTTP GET (this works in the browser):

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 (this does not work in the browser):

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

Another thing that could be throwing a wrench in the works: I'm using mod-rewrite so that the user-visible domain.com/Users/1 is actually domain.com/control.py/Users/1

There may be more information/troubleshooting that I have, but I'm drawing a blank right now.

The Question:

Why does this work with a GET request, but not a POST request? Am I missing a response header somewhere?

EDIT:

Using IE9 Developer Tools and Chrome's Inspector, it looks like the 303 isn't coming back to the browser after a POST. However, I can see the 303 come in when I do a GET request.

However, after looking more closely at Chrome's Inspector, I saw the ability to log every request (don't clear w/ each page call). This allowed me to see that for some reason, my POST request looks like it's failing. Again - GET works just fine.

回答1:

It's entirely possible that this isn't your issue, but since you don't have your code posted I'll take a shot (just in case).

Since you're using web.py, do you have the POST method defined on your object?

i.e.

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

class page:

    def POST(self):
        # Do something

    def GET(self):
        # Do something else