303

HTTP 303 See Other

3xx Redirection

3xx Redirection RFC 7231, Section 6.4.4

What is HTTP 303 See Other?

The 303 (See Other) status code indicates that the server is redirecting the user agent to a different resource that provides an indirect response to the request. The client should use GET to fetch the new resource. This is commonly used after a POST request to redirect to a results page, preventing form resubmission if the user hits refresh.

Common Use Cases

  • Post-Redirect-Get (PRG) pattern for forms
  • Redirecting to a payment confirmation page
  • API redirect to a status endpoint

Usage Example

After processing a credit card payment via POST, return 303 See Other with a Location header pointing to a confirmation page. The browser will use GET to fetch the confirmation, so if the user hits refresh, the payment is not resubmitted — the confirmation page simply reloads.

// Laravel - Post-Redirect-Get pattern
return redirect()
    ->route('orders.confirm', $order)
    ->setStatusCode(303);

// Stripe-like payment redirect
return redirect('https://checkout.stripe.com/c/pay_123', 303);

Common Mistakes

⚠️

Mistake: Using 303 when the method must be preserved

Fix: 303 always forces GET on the redirected request, regardless of the original method. If you need to preserve POST, PUT, or DELETE through the redirect, use 307 Temporary Redirect instead.

⚠️

Mistake: Returning a body with a 303 response

Fix: Do not include a response body with 303. The client should follow the Location header. Any body content will be ignored by the browser.

Last updated: 21 Jun 2026