▪️目的
この記事では代表的なHTTPステータスコード300番台について解説します。
*200番台については以下の記事で解説しています。
→「https://lovelabengineer.com/2026/09/24/httpステータスコードとは?-200番台について解説/」
▪️300番台の意味
HTTPステータスコードの300番台は、リクエストを完了するために追加の処理(リダイレクトや転送など)が必要であることを示します。
♦︎300(Multiple Choices)
300(Multiple Choices)は、候補が複数あることを示します。
例えば、ブラウザが以下のアクセスをしたとします。
「GET /document」
しかし、サーバには
/document
├─ /document.html
├─ /document.pdf
└─ /document.txt
のように複数の選択肢(提供先)があるとします。
この場合、サーバはブラウザに
「HTTP1.1 300 Multiple Choices」
としてレスポンスを返します。
♦︎301(Moved Permanently)
301(Moved Permanently)は、検索したURLが変更されたことを意味します。
例えば、URLが
以前:https://lovelab.com/old
現在:https://lovelab.com/new
のように変更されたとします。
ブラウザが
GET /old HTTP/1.1
Host: lovelab.com
にアクセスすると、サーバは
HTTP/1.1 301 Moved Permanently
Location: https://lovelab.com/new
と返します。この時重要なのは「Location ヘッダー」です。
これは「URLの新規移動先」を表します。ブラウザは「Location ヘッダー」の移動先URLへアクセスします。
そして、サーバから
HTTP1.1 200 OK
と返ってきてページが表示されます。
このページ移動は自動的に行われるため、ユーザが意識することはありません。しかし、URLを見ると当初のURLから変化していることがわかります。
♦︎302(Found)
302(Found)は、リクエスト先が一時的に別の場所にあることを示します。301と似ていますが、302は「恒久的」でなく「一時的」です。
例えば、URLが
以前:https://lovelab.com/old
現在:https://lovelab.com/new
とすると、
ブラウザ
│ GET /old
↓
Webサーバー
│ 302
│ Location: /new
↓
ブラウザ
│ GET /new
↓
Webサーバー
│ 200 OK
↓
ブラウザ
となります。
サーバのメンテナンスなどでサーバが使用できない場合に、一時的にリクエスト先を変更します。
♦︎303(See Other)
303(See Other)は、リクエスト先に対する結果は他のURLに存在する場合に使われます。
ユーザはその URLに自動的に誘導されます。
例えば、ブラウザ:
POST /users HTTP/1.1
Content-Type: application/json
{
"name": "Taro"
}
を送ります。
すると、サーバ:
HTTP/1.1 303 See Other
Location: /users/123
を返します。
すると、ブラウザ:
GET /users/123
と自動的に送信します。
再度、サーバ:
HTTP/1.1 200 OK
{
"id": 123,
"name": "Taro"
}
をレスポンスとして返します。
これはWEBフォーム送信時の
フォーム送信
↓
POST
↓
登録処理
↓
303
↓
登録結果ページをGET
という流れです。
♦︎304(Not Modified)
304(Not Modified)は、「前に持っているキャッシュをそのまま使ってもいいよ」という意味です。
例えば、ブラウザが以前
「https://lovelab.com/style.css」
を取得したとします。
最初は、
ブラウザ
↓
GET /style.css
↓
サーバ
↓
200 OK
style.css
↓
ブラウザ
となります。
そして、ブラウザはこのCSSを「キャッシュ」として保存します。
*キャッシュ=再利用
その後、再びブラウザが同じページを開いたとします。
ブラウザは、「前に取得したstyle.css、まだ変更されてないかな?」と確認します。
そこで、サーバに
GET /style.css HTTP/1.1
Host: lovelab.com
If-None-Match: "abc123"
のようなリクエストを送ります。
この「If-None-Match」は「データの識別情報」でキャッシュとサーバが持つデータが同じか確認する際に使用します。
そして、サーバ側で変更があるかを確認します。
「If-None-Match」の値を確認して、同じの場合は前回から変更はありません。
そこで、サーバは
HTTP/1.1 304 Not Modified
をレスポンスとして返します。
その後、ブラウザは変更点がないことがわかったため、そのままブラウザ上のキャッシュを使用します。
♦︎307(Temporary Redirect)
307(Temporary Redirect)は、リクエスト先が一時的に別の場所にあることを意味します。302との違いは、307では「HTTPメソッド」を維持します。
例えば、ブラウザが
POST /api/users
Content-Type: application/json
{"name": "Taro"}
を送信します。
サーバが
HTTP/1.1 307 Temporary Redirect
Location: /api/v2/users
を返します。
するとブラウザは
POST /api/v2/users
Content-Type: application/json
として同じ「HTTPメソッド」のまま「Location ヘッダー先」へアクセスします。
ここが302とに違いです。言い換えると、302では「HTTPメソッド」を新旧のアクセスでそれぞれ変更できます(POST → GETなど)。
♦︎308(Permanent Redirect)
308(Permanent Redirect)は、リクエスト先が別のURLに変更されたことを意味します(恒久的)。
301との違いは、「HTTPメソッド」を維持する点です。
例えば、ブラウザが
POST /api/users
にアクセスしたとします。
すると、サーバが
HTTP/1.1 308 Permanent Redirect
Location: /api/v2/users
と返します。
すると、ブラウザは
POST /api/v2/users
として「HTTPメソッド」を維持したまま「Location ヘッダー先」にアクセスします。
▪️まとめ
300番台にも様々なステータスコードがありますが、まとめると別のページに移動させるために使用するステータスコードです。

No responses yet