303 See Other: redirecting after a form submission

303 See Other redirects the client to another URL that must be fetched with GET, typically after a form submission.

Check a URL’s status code

303 See Other redirects the client to a different URL and tells it to fetch that URL with GET, whatever method the original request used. Its classic job is finishing a form submission: the server processes a POST, then sends the browser to a result page.

Definition

RFC 9110, section 15.4.4 describes 303 as a redirect to another resource, named in Location, that provides “an indirect response to the original request.” The client follows it with a GET. Unlike 302, there’s no ambiguity about the method, and unlike 307, the method is meant to change.

A 303 in reply to a GET is rarer. It means the server has no representation of the requested thing to send, but the target URL describes it. Linked Data sites use this to separate an identifier for a real-world object from a document about it.

Post/Redirect/Get

Without a redirect, refreshing a “thank you” page re-submits the form and can create duplicate orders or messages. The Post/Redirect/Get pattern solves it:

POST /contact HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded

name=Sara&message=Hello

HTTP/1.1 303 See Other
Location: /contact/thanks/
Content-Length: 0

In PHP: header('Location: /contact/thanks/', true, 303);. In Express: res.redirect(303, '/contact/thanks/').

SEO impact

Google’s documentation treats 303 like 302: Googlebot follows it, but it’s only a weak canonical signal, so the original URL generally stays canonical. That’s fine for form flows, which crawlers don’t submit anyway. Two practical notes:

  • Don’t use 303 to move pages. For permanent moves, use 301 or 308.
  • Confirmation and “thanks” pages have no search value; add noindex so they stay out of the index if someone links to them.

To see what a page URL returns to an ordinary visit, trace it with the redirect checker.

Frequently asked questions

When should I use 303 instead of 302?

Use 303 after a POST, PUT or DELETE when you want the browser to load a result page with GET. It states that intent clearly, while 302’s method handling has historically varied between clients.

Does Google treat 303 differently from 302?

No. Google’s documentation says 303 is handled like 302: Googlebot follows it, and the original URL usually remains canonical.

Why does refreshing my form page ask to resend data?

The form’s result page was returned directly in response to the POST. Redirect with 303 to a separate result URL and a refresh will simply reload that page.