303 redirect (See Other)
The server points the client to a different resource that describes the result of the request. The follow-up request is always a GET (or HEAD).
How Google handles a 303
Google treats 303 like a temporary redirect (like 302 and 307). It is rarely seen on indexable pages, because its main job is sending a browser to a result page after a form submission.
Use a 303 for
- Post/Redirect/Get: after a form POST, send the browser to a confirmation page so a refresh does not resubmit the form
- APIs that create a resource and point to where it can be fetched
Don’t use it for
- Moving content: use 301/308 or 302/307 instead
- Any case where the follow-up request must keep the POST body
What happens to a POST
A browser sends POST /checkout with a form body. The server answers with…
Temporary, always GET. This is the intended behaviour: “see the result over there.” It powers the Post/Redirect/Get pattern, so refreshing the confirmation page doesn’t resubmit the order.
Setting up a 303
Nginx
location = /subscribe { if ($request_method = POST) { return 303 /thanks; } }Express (Node.js)
res.redirect(303, '/thanks')PHP
header('Location: /thanks', true, 303); exit;Nuxt / h3
return sendRedirect(event, '/thanks', 303)Need rules for a whole list of URLs? The redirect rule generator writes them for Apache, Nginx, Vercel and Netlify.
Check that it works
Questions
When should I use 303 instead of 302?
Use 303 when you explicitly want the follow-up request to be a GET, typically right after a form POST. 302 has the same effect in browsers only for historical reasons; 303 makes the intent unambiguous.
Is 303 cacheable?
A 303 response is not a stand-in for the target. RFC 9110 notes that the target resource of the Location URI may be cached, but browsers do not reuse the 303 itself in place of the original request.
Other codes: 301 · 302 · 307 · 308 · 301 vs 302