301リダイレクトとは?302との違いと設定方法|Apache・nginx・Next.js

301リダイレクトは、「このURLは恒久的に別の場所へ移りました」とブラウザと検索エンジンに伝える仕組みです。URLを変えたときに、古いURLへのアクセスを新しいURLへ自動で転送します。

似たものに302がありますが、この2つを取り違えると、検索結果に出るURLが意図しないほうになります。

この記事では、301と302・307・308の違い、サーバーごとの設定方法、そして設定したあとに必ず確認すべきことまでを整理します。

301リダイレクトとは

301は「Moved Permanently(恒久的に移動した)」を表すHTTPステータスコードです。300番台はリダイレクト(転送)に関する番号で、リクエストされたURLとは別の場所を見るよう指示します。

301を返すと、次のことが起こります。

  • ブラウザは自動的に新しいURLへ移動する
  • ブラウザは転送先を強くキャッシュする(次回から古いURLにアクセスせず直接新URLへ行く)
  • 検索エンジンは新しいURLをインデックスの対象に切り替える

301・302・307・308の違い

4つとも転送ですが、「恒久的か一時的か」と「リクエストメソッドを変えてよいか」の2軸で分かれます。

番号 意味 恒久/一時 メソッド
301 Moved Permanently 恒久的に移動 恒久 POSTがGETに変わることがある
302 Found 一時的に別の場所 一時 POSTがGETに変わることがある
307 Temporary Redirect 一時的に別の場所 一時 メソッドを変えない
308 Permanent Redirect 恒久的に移動 恒久 メソッドを変えない

301と302は歴史的な経緯から、POSTで送ったリクエストがGETに変換されることがあります。フォーム送信やAPIの転送でこれが起きると、送ったはずのデータが消えます。メソッドを保ったまま転送したい場合に用意されたのが307と308です。

どちらを選ぶかの判断

状況 使うもの
サイトをリニューアルしてURL構成が変わった 301
独自ドメインに引っ越した 301
httpからhttpsに統一した 301
www有無を片方に寄せた 301
メンテナンス中に案内ページへ飛ばす 302(または503)
期間限定キャンペーンページへ一時的に飛ばす 302
APIでPOSTを保ったまま転送したい 308

迷ったら「元のURLをこの先も使うか」で判断します。使うなら302、使わないなら301です。

設定方法

Apache(.htaccess)

# 単一ページの転送
Redirect 301 /old-page.html https://example.com/new-page/

# ディレクトリごと転送
RedirectMatch 301 ^/blog/(.*)$ https://example.com/column/\

# httpsへ統一
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

[R=301,L] の R=301 がステータスコード、L は「ここで書き換えを終える」という意味です。

nginx

# 単一ページの転送
location = /old-page.html {
    return 301 https://example.com/new-page/;
}

# ドメインごと転送(パスを保持)
server {
    server_name old-example.com;
    return 301 https://example.com$request_uri;
}

$request_uri を付けるとパスとクエリをそのまま引き継ぎます。これを忘れると、どのページからアクセスしてもトップページに飛んでしまいます。

WordPress

サーバー設定を触らずに済ませるなら、リダイレクト用のプラグインを使うのが一般的です。パーマリンク設定を変更した場合、WordPressが自動で転送してくれるとは限りません。変更前のURLを控えたうえで設定します。

Next.js

// next.config.js
module.exports = {
  async redirects() {
    return [
      {
        source: '/old-page',
        destination: '/new-page',
        permanent: true,   // true なら308、false なら307
      },
    ]
  },
}

permanent: true が返すのは301ではなく308です。意味は同じ「恒久的」ですが、メソッドを保持する点が違います。Next.jsの全体像はNext.jsとは?初心者向け完全入門ガイドにまとめています。

設定したあとに確認すること

1. 実際に301が返っているか

ブラウザで開くと転送されるため、何番で転送されたかは画面からは分かりません。コマンドで確認します。

curl -I https://example.com/old-page

# 出力例
# HTTP/2 301
# location: https://example.com/new-page/

Pythonなら次のように経路を確認できます。

import requests

res = requests.get("https://example.com/old-page")
print(res.status_code)   # 最終的なステータス(転送後なら200)
print(res.url)           # 最終的なURL
for r in res.history:
    print(r.status_code, r.url)   # 経由した転送を順に表示

2. リダイレクトチェーンになっていないか

A→B→C と2段階以上転送している状態をリダイレクトチェーンと呼びます。表示が遅くなり、転送のたびに情報が減る可能性があります。

httpからhttpsへの統一とwww有無の統一を別々に設定すると、意図せず2段階になりがちです。http://example.com → https://example.com → https://www.example.com のような経路になっていないか、res.history で確認します。

3. ループしていないか

AからBへ、BからAへと転送する設定を書くと無限ループになり、ブラウザがエラーを表示します。条件分岐を含む書き換えルールで起きやすい失敗です。

4. 転送先が404になっていないか

一括置換で転送ルールを作ると、存在しないURLへ転送していることがあります。転送先が生きているかまで確認してください。404の扱いは404エラーの原因と対処法にまとめています。

301を使うときの注意点

ブラウザのキャッシュが強く効く

301はブラウザに長く記憶されます。一度301で転送すると、設定を消してもそのブラウザは古い転送先へ行き続けることがあります。

試しに301を設定する、という使い方は避けてください。迷っている段階では302を使い、確定してから301に変えるのが安全です。

すべてをトップページに転送しない

URLが変わったページを、まとめてトップページへ301することがありますが、訪問者は求めたものと無関係なページに着きます。対応する新URLがないなら、転送せず404か410を返すほうが適切です。

転送元のページは残さない

301を設定したうえで元のページも生きている状態にすると、同じ内容のページが2つ存在することになります。転送するなら元は消すのが原則です。

よくある質問

301と302、SEOで有利なのはどちらですか

有利不利ではなく意味が違います。恒久的な移転で302を使うと、検索結果に古いURLが残り続けることがあります。正しい意味の番号を使うことが結果的に最善です。

301リダイレクトは検索順位に反映されるまでどのくらいかかりますか

クロールされて初めて認識されるため、すぐには切り替わりません。サイトの規模やクロール頻度によって変わります。設定後はSearch Consoleで新URLの状況を確認します。

htaccessに書いたのに転送されません

ファイルの置き場所(対象ディレクトリの直下か)、サーバーが .htaccess を読む設定になっているか、記述の順序を確認します。先に書いたルールが優先されるため、上のほうで別のルールに一致していないかも疑ってください。

ドメインを移転しました。すべてのページを転送したいです

nginxなら return 301 https://新ドメイン$request_uri;、Apacheなら RedirectMatch でパスを引き継ぐ形にします。トップページだけに転送する設定にしないことが要点です。

まとめ

301は恒久的な移転、302は一時的な転送です。元のURLをこの先も使うかどうかで選びます。POSTを保ったまま転送したい場合は308と307を使います。

設定したら、curlかrequestsで実際の番号と経路を確認すること。ブラウザで開くだけでは、何番で転送されたかもチェーンになっているかも分かりません。

そして301はキャッシュが強く効くため、試験的に使わないこと。迷っている間は302にしておくのが安全です。

ステータスコード全体はHTTPステータスコード一覧、HTTPSへの統一についてはHTTPとHTTPSの違いで扱っています。

対面・無料|東京・永田町で毎週土曜日13時

1回の参加で、プログラミングの構造がわかる

ゼロからはじめるPython入門講座

8年間・累計600回開催/これまで全国で2万人以上が参加

「やはり対面で聞けるのはとても気づきがあり、価値があると思います」

参加者の声

  • 本当に初心者からの講座です。プログラミングに触ったことがなくて大丈夫です
  • 対面だから、その場で聞けます。つまずいた所を持ち帰らずに解決できます
  • 講座は1時間。そのあとも残って学習を続けられ、講師にも質問できます
  • 独学で挫折した方も。糸口が見つかって、講座のあと会員になる方が多くいます

無料で参加する|開催日程を見る

参加費は無料です