303 See Other

結果を別の URL から GET で取得させる場合。

使いどころ

フォームの POST 後のリダイレクト。再読み込みで再送信されないようにします。

知っておきたいこと

303 は Post/Redirect/Get に使う正しいコードです。フォームの POST 後に 303 で結果ページへリダイレクトすると、ブラウザーはそのページを GET で読み込むため、再読み込みや戻るボタンでフォームが再送信されません。302 と違い、PUT や DELETE を含む元のどのメソッドでも GET への切り替えが仕様で保証されており、リクエストボディは破棄されます。

検索エンジンは 303 を一時的なリダイレクトとして扱いますが、クロール対象の URL に現れることはまれです。ヘッダーで指定しない限りキャッシュされません。API では、303 を使って完了した非同期ジョブからその結果へクライアントを誘導できます。fetch はデフォルトのリダイレクトモードでこれを自動的にたどります。response.redirected でリダイレクトが起きたことがわかり、response.url で GET 後の最終的なアドレスがわかります。

リダイレクト (3xx)

3xx はリダイレクトです。リクエストを完了するには、クライアントが別の場所へ移動するか、キャッシュしたコピーを使う必要があります。

レスポンスでの表示

HTTP/1.1 303 See Other

返し方

Node.js / Expressres.redirect(303, '/new-url')
Python / Flaskreturn redirect('/new-url', code=303)
nginxreturn 303 https://example.com$request_uri;

確認方法

curl -s -o /dev/null -w "%{http_code}\n" https://example.com/

HTTP ステータスコードを開く