WebブラウザがサーバーにリクエストするたびにHTTPステータスコードが返されます。サイト運用やSEO改善をするうえで、主要なステータスコードの意味を理解しておくことは欠かせません。
ステータスコードの分類
ステータスコードは先頭の数字によって5つのカテゴリに分類されており、発生した問題の種類をすぐに把握できます。
| コード範囲 | 分類 | 意味 |
|---|---|---|
| 1xx | 情報レスポンス | 処理継続中 |
| 2xx | 成功 | リクエスト成功 |
| 3xx | リダイレクト | 別URLへの転送 |
| 4xx | クライアントエラー | リクエスト側の問題 |
| 5xx | サーバーエラー | サーバー側の問題 |
よく使うステータスコード
サイト運用やSEO対応で特に重要な200・301・302・403・404・500・503を取り上げ、意味と対処法を説明します。
200 OK
リクエストが正常に処理されました。通常のページ表示やAPIレスポンスで返されます。
301 Moved Permanently(恒久的リダイレクト)
URLが恒久的に移動しました。SEO評価(リンクの評価)も新URLに引き継がれます。HTTPからHTTPS、wwwあり→なしの統一、旧URLから新URLへの恒久移転に使います。
302 Found(一時的リダイレクト)
URLが一時的に移動しました。メンテナンスページへの一時転送など、元のURLに戻す予定がある場合に使います。SEO評価は引き継がれません。
403 Forbidden
アクセスは届いているが、権限がないため拒否されました。.htaccess のIP制限やディレクトリ保護が原因であることが多いです。
404 Not Found
リクエストされたURLが存在しません。削除したページ、URLの変更後に古いURLが残っている場合などに発生します。
SEOの観点: 404ページが大量に発生している場合、Googleがクロールを無駄に消費します。移転したページには必ず301リダイレクトを設定してください。
500 Internal Server Error
サーバー内部でエラーが発生しました。PHPのコードエラー、.htaccess の記述ミス、パーミッション設定ミスなどが原因です。
503 Service Unavailable
サーバーが一時的に利用できません。メンテナンス中やサーバー過負荷時に返します。SEOクローラーに「一時的な問題」として伝えるため、503とともにRetry-Afterヘッダーを返すのが正しい実装です。
307 Temporary Redirect / 308 Permanent Redirect
301・302と異なり、HTTPメソッド(POST等)を保持したままリダイレクトします。フォーム送信先を変えるなど、POSTリクエストを転送したい場合に使います。
| コード | 種類 | SEO評価引き継ぎ | メソッド保持 |
|---|---|---|---|
| 301 | 恒久リダイレクト | あり | なし(GETに変換される場合あり) |
| 302 | 一時リダイレクト | なし | なし |
| 307 | 一時リダイレクト | なし | あり |
| 308 | 恒久リダイレクト | あり | あり |
通常のページ転送には301を使えば問題ありません。
401 Unauthorized
認証が必要ですが、認証情報が提供されていません。Basic認証がかかっているページにログインせずアクセスした場合に返されます。
410 Gone
リソースが恒久的に削除されました。404と異なり「二度と存在しない」という意思表示です。削除済みページをGoogleのインデックスから早く消したい場合は404より410が有効です。
429 Too Many Requests
短時間に過剰なリクエストを送信した場合に返されます。APIのレート制限やDDoS対策で使われます。
502 Bad Gateway / 504 Gateway Timeout
サーバーが上流のサーバーから無効なレスポンスを受け取った(502)、または応答がなくタイムアウトした(504)状態です。Nginx+PHP-FPMなどのリバースプロキシ構成で発生しやすく、PHP-FPMのプロセス数不足やメモリ不足が原因になることがあります。
301リダイレクトの設定方法(.htaccess)
Apacheサーバーでの代表的な301リダイレクト設定例です。
# 特定のページを別URLに転送
Redirect 301 /old-page/ https://example.com/new-page/
# HTTP → HTTPS に全ページ転送
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# www あり → なし に統一
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
設定後は古いURLにアクセスして正しく転送されるかを必ず確認します。
ステータスコードの確認方法
実際にURLがどのステータスコードを返しているかを確認する方法は2つあります。
ブラウザの開発者ツールで確認
Chrome・Edgeなどの開発者ツール(F12キー)→「ネットワーク」タブでページを読み込むと、すべてのリクエストのステータスコードを確認できます。
curlコマンドで確認
コマンドラインが使える環境では curl コマンドで確認できます。
curl -I https://example.com
-I オプションでHTTPヘッダーのみを取得します。HTTP/2 200 のような行でステータスコードが確認できます。
リダイレクトチェーンに注意
複数の301リダイレクトが連鎖すると(例: A→B→C→D)、ユーザーの体感速度が低下し、SEO評価の引き継ぎも弱まります。リダイレクトは1ホップに収めるのが理想です。
HTTPステータス・リダイレクトチェッカーでは、URLを入力するだけでリダイレクトチェーン全体を可視化できます。