日本語 English(Home)

301リダイレクトとは?.htaccess・nginxの書き方と確認方法

URLを変えたりサイトを移転したりするときは、古いURLから新しいURLへの301リダイレクトが欠かせません。種類の使い分け、サーバーごとの書き方、確認の手順、移転のチェックリストを実例つきで整理します。

301リダイレクトとは?.htaccess・nginxの書き方と確認方法

この記事の要点:

  • 301リダイレクトは恒久的な移動を伝える転送で、Googleは転送先を正規のURLとする強いシグナルとして扱う
  • 元に戻さないURL変更・ドメイン移転・http→httpsには301(または308)、一時的な移動には302(または307)を使う
  • 削除したページを関係のないページやトップへまとめて転送せず、代わりのページが無ければ404を返す
  • 設定後はcurl -Iで301と転送先を確かめ、転送が2回以上続くチェーンは最終のURLへ直接転送するよう直す
  • サイト移転のリダイレクトは、Googleの案内どおり少なくとも1年は残す

301リダイレクトとは

301リダイレクトとは、あるURLのページが別のURLへ恒久的に移動したことを、サーバーがステータスコード「301」で伝える転送の方法です。古いURLを開いた人やクローラーは、自動で新しいURLへ移動します。

Googleは、恒久的なリダイレクトを「転送先のURLを正規のURLとして扱うべき」という強いシグナルとして扱うと説明しています。URLを変えたときに301を設定しておくと、次の3つを守れます。

  • 読者:ブックマークや他サイトのリンクから来た人が、404ページで行き止まりにならない
  • 検索での扱い:古いURLに集まっていたリンクなどのシグナルが、新しいURLにまとめられる
  • クロール:Googleが古いURLの代わりに新しいURLを見つけ、検索結果のURLを入れ替える

正規のURLの考え方は「canonicalとは」で説明しています。

リダイレクトの種類と使い分け

リダイレクトは、サーバーが返すステータスコード(ページの状態を表す3桁の番号)で種類が分かれます。Googleは、恒久的か一時的かで扱いを変えます。

種類意味Googleでの扱い
301 Moved Permanently恒久的な移動転送先を正規のURLとする強いシグナル
308 Permanent Redirect恒久的な移動(送信方法を変えない)301と同じく恒久的として扱う
302 Found・307 Temporary Redirect一時的な移動転送元のURLを正規のURLとして残す可能性が高い
meta refreshHTMLの中で転送を指示すぐに転送する場合は恒久的、時間をおく場合は一時的として扱う
JavaScriptでの転送スクリプトで別のURLへ移動読み取れないことがあるため、サーバー側で設定できない場合の最後の手段

どれを使うかの判断の目安

状況使うもの
URLを変えて、元に戻す予定がない(スラッグ変更、ドメイン移転、http→https)301(または308)
メンテナンス中だけ、告知ページへ移したい302(または307)
期間限定のキャンペーンのため、数週間だけ別ページを見せたい302
サーバーの設定を変えられないホスティングを使っている待ち時間0秒のmeta refresh
ページを削除し、内容の近い代わりのページが無い転送せず404または410

設定したつもりの種類と、実際にサーバーが返している番号が合っているかは、後で説明するcurlで必ず確かめます。

リダイレクトとは:307・308が301・302と違う点

リダイレクトとは、あるURLを開いた人やクローラーを、別のURLへ自動で移す仕組みです。307と308は、元のリクエストのメソッド(POSTなど)と本文を変えずに転送する点が301・302と違い、古いクライアントは301でGETに変えてしまうことがあります(MDN:307・308、2026年10月14日に確認)。フォームの送信先のURLを移すときは308(一時的なら307)を選びます。Googleは308を301と、307を302と同じ扱いにします。

301リダイレクトを使う場面・使わない場面

使う場面

  • URLを変えたとき:例:/blog/2024/seo-tips.html を /blog/seo-tips/ に変えた
  • サイト構造を変えたとき:例:/column/ 配下の記事を /blog/ 配下へ移した
  • ドメインを変えたとき:例:old-example.jp から example.com へ移転した
  • httpからhttpsへ切り替えたとき
  • URLの表記をそろえるとき:wwwの有無、末尾のスラッシュ、index.html の有無(URLの正規化)
  • 記事を統合したとき:内容が重なる2本の記事を1本にまとめた(カニバリゼーションの解消)

使わない場面

  • 削除したページを、関係のないページやトップページへまとめて転送する:Googleは、内容の合わない転送先をソフト404(実質的に「ページが無い」)として扱うことがあります。代わりのページが無ければ404を返します。
  • 一時的な移動:元のURLに戻すなら302を使います。
  • 同じ内容のページを両方残したいとき:例:印刷用ページのように両方を見せる必要があるなら、転送ではなくcanonicalで正規のURLを示します。

サーバーでの書き方(.htaccess・nginx)

Apacheを使うサーバー(多くのレンタルサーバー)では、サイトのルートにある .htaccess に書きます。nginxでは、サーバーの設定ファイルの server ブロックに書きます。どちらも、書き間違えるとサイト全体が表示されなくなることがあるため、変更前に元のファイルを保存しておきます。例のドメインは説明用です。

WordPressの .htaccess では、転送のルールを「# BEGIN WordPress」の行より上に書きます。下に書くと、WordPressのルールが先に処理され、転送されないことがあります。

ページ単位

# Apache(.htaccess)
RedirectMatch 301 ^/old-page/$ https://example.com/new-page/

# nginx
location = /old-page/ {
    return 301 https://example.com/new-page/;
}

Apacheの Redirect 301 /old /new という書き方は「前方一致」です。/old を指定すると /old-campaign/ まで転送されてしまうため、1ページだけを転送したいときは、上のように先頭(^)と末尾($)を指定した RedirectMatch を使うと安全です。

ディレクトリ単位

# Apache(.htaccess)
RewriteEngine On
RewriteRule ^column/(.*)$ https://example.com/blog/$1 [R=301,L]

# nginx
location ^~ /column/ {
    rewrite ^/column/(.*)$ https://example.com/blog/$1 permanent;
}

例:/column/seo-tips/ は /blog/seo-tips/ へ転送されます。記事のスラッグを変えずにディレクトリだけ移した場合に使えます。nginxの permanent は301を返す指定です。

httpからhttpsへ

# Apache(.htaccess)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

# nginx(80番ポートのserverブロック)
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}

CDNやロードバランサーの後ろにあるサーバーでは、サーバーから見た通信が常にhttpになり、この条件で転送がループすることがあります。その場合は、レンタルサーバーやCDNの管理画面にある「常時SSL化」などの設定を使います。

wwwの有無をそろえる(httpsと同時に1回で)

# Apache(.htaccess):http と www ありを、まとめて https://example.com へ
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www. [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

# nginx(443番ポートのwwwありを転送)
server {
    listen 443 ssl;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

httpsへの転送とwwwの統一を別々のルールで書くと、http://www.example.com/ → https://www.example.com/ → https://example.com/ の2回の転送になります。上のように条件をまとめると、1回で最終のURLへ届きます。

httpからhttpsへのリダイレクトで確かめること

httpからhttpsへのリダイレクトは、http・httpsとwwwの有無の4通りのURLが、すべて1回の301で同じhttpsのURLへ届けば完了です。

for u in http://example.com/ http://www.example.com/ https://www.example.com/ https://example.com/; do
  curl -s -o /dev/null -L -w "%{http_code} %{num_redirects} $un" "$u"; done
  • 混在コンテンツ:httpsのページがhttpのスクリプトなどを読み込むと、ブラウザが読み込みを止めます(MDN:混在コンテンツ)。開発者ツールのコンソールで見つけ、URLをhttpsに直します。
  • HSTS:Strict-Transport-Securityヘッダーを返すと、ブラウザは以後そのホストにhttpsだけで接続します(MDN)。全ページがhttpsで動くことを確かめてから設定します。
  • Search Console:ドメイン プロパティはhttpとhttpsの両方を含みます。URLプレフィックス プロパティならhttpsのURLで追加します。

Googleは2014年8月に、HTTPSをランキングのシグナルとして使い、当面はその重みを非常に小さくすると発表しています(Google 検索セントラル ブログ)。

末尾のスラッシュをそろえる

# Apache(.htaccess):ファイル以外のURLに「/」を付ける
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.*)$ https://example.com/$1/ [R=301,L]

# nginx:拡張子のないURLに「/」を付ける
rewrite ^([^.]*[^/])$ $1/ permanent;

どちらも、サイトのURLが「/」で終わる設計の場合の例です。画像やCSSのような拡張子のあるファイルには付けません。CMSが同じ処理をしている場合は、二重にしないよう先に確かめます。nginxは、設定を変えたら nginx -t で構文を確かめてから再読み込みします。

WordPressでの設定方法

方法向いている場面注意点
WordPress本体の機能投稿のスラッグを変えたとき古いスラッグから自動で転送されることがあるが、固定ページやカテゴリーの変更は対象外の場合がある。必ず実際に確かめる
リダイレクト用プラグイン、SEOプラグインのリダイレクト機能記事単位の転送を管理画面で登録・一覧したいプラグインを停止すると転送も止まる。転送元・転送先の一覧を書き出して保存しておく
.htaccess(Apache)ドメイン移転、http→https、ディレクトリ単位の転送「# BEGIN WordPress」より上に書く
レンタルサーバーの管理画面常時SSL化、wwwの統一.htaccessに同じルールを書いて二重にしない
テーマやプラグインのコード(wp_redirect)条件によって転送先を変えたいwp_redirect() は何も指定しないと302になる。wp_redirect( $url, 301 ); のように番号を指定する

例:パーマリンク設定を「日付と投稿名」から「投稿名」に変えると、すべての記事のURLが変わります。本体の推測に任せず、.htaccess で ^d{4}/d{2}/d{2}/(.+)$ のような規則で新しいURLへ301を設定し、主要な記事を個別に確かめます。パーマリンクの設定の種類と決め方は「パーマリンクとは」で説明しています。

設定後の確認方法(curl・URL検査)

curl -I でステータスコードを見る

ブラウザは転送を自動でたどってしまい、301か302かが分かりません。ターミナルで curl -I を使うと、サーバーの返事(ヘッダー)だけを表示できます。

$ curl -I http://example.com/old-page/
HTTP/1.1 301 Moved Permanently
Location: https://example.com/new-page/

1行目の番号が301(または308)で、Locationが意図した転送先になっていれば正しく設定されています。転送が何回続くかは、-L を付けて最後までたどると分かります。

$ curl -sIL http://www.example.com/old-page/ | grep -iE "^(HTTP|location)"
HTTP/1.1 301 Moved Permanently
Location: https://example.com/old-page/
HTTP/2 301
location: https://example.com/new-page/
HTTP/2 200

この例では転送が2回続いています。1回で /new-page/ へ届くように、ルールを直します。

多くのURLをまとめて確かめる

移転のときは、古いURLの一覧(1行に1URL)を用意して、最終的なステータスと転送の回数をまとめて出します。

while read -r u; do
  curl -s -o /dev/null -L -w "%{http_code} %{num_redirects} $u -> %{url_effective}n" "$u"
done < old-urls.txt

すべての行が「200 1」(最終が200で、転送は1回)になっていれば理想です。「404」や「200 3」の行を拾って直します。

Search Consoleで確かめる

  • URL検査:新しいURLを検査し、「URL は Google に登録されています」になっているか、「Google が選択した正規 URL」が新しいURLかを確かめます。古いURLを検査すると、転送されていることが分かります。
  • ページのインデックス登録:古いURLが「リダイレクトを含むページ」に入るのは正常です。「リダイレクト エラー」に入ったURLは、チェーンやループを疑います。

リダイレクトチェーン・ループとよくある失敗

リダイレクトチェーンとは、A→B→Cのように転送が何回も続く状態です。Googlebotは最大10回まで転送をたどり、それまでに内容を取得できないと、Search Consoleでリダイレクト エラーとして表示されます。回数が少なくても、転送が続くほど表示は遅くなります。リダイレクトループは、A→B→Aのように転送が循環し、ページがいつまでも表示されない状態です。

起きること原因直し方
転送が2回、3回と続くURL変更を重ねるたびに、前の転送の先に新しい転送を足したすべての古いURLを、最終のURLへ直接転送するよう書き換える
「リダイレクトが繰り返し行われました」と表示されるサーバーとプラグイン(またはCDN)の両方でhttpsやwwwの転送を設定し、条件が食い違っている転送の設定を1か所にまとめる
検索結果に古いURLが残り続ける302のまま、またはサイト内のリンク・canonical・サイトマップが古いURLのまま301に直し、内部リンク・canonical・XMLサイトマップを新しいURLに書き換える
無関係なページへ移した記事が登録されない内容の合わない転送先がソフト404と見なされた内容の近いページへ転送する。無ければ404にする
しばらくして古いURLが404に戻ったサーバーの移行やプラグインの停止で、転送の設定が消えた転送の一覧を保存しておき、移行後にcurlで再確認する
古いURLへの転送が効かないrobots.txtで古いURLのクロールを止めている転送元のURLはクロールを許可し、Googleが転送に気づけるようにする

サイト移転のチェックリスト

ドメインの変更やURL構造の大きな変更は、手順を分けて進めます。Googleは、移転のリダイレクトをできるだけ長く、少なくとも1年は残すよう勧めています。ページの棚卸しから公開後の監視までのリニューアル全体の進め方は「サイトリニューアルのSEO:順位を落とさない移行の手順」で説明しています。

時期やること
移転前古いURLと新しいURLの対応表(1対1)を作る。外部リンクが多いページを、被リンクの調査で洗い出しておく。新しいサイトのSearch Consoleのプロパティを用意する
移転時対応表どおりに301を設定する。内部リンク・canonical・hreflang・構造化データのURLを新しいURLに書き換える。新しいURLだけのサイトマップを送信する
移転直後対応表の全URLをcurlで確かめる。ドメインを変えた場合は、Search Consoleの「アドレス変更」ツールで移転を伝える
移転後「ページのインデックス登録」と検索パフォーマンスで、新旧のURLの入れ替わりを見る。外部リンクの多いページは、可能ならリンク元に新しいURLへの変更を依頼する
1年以上転送は外さずに残す。古いドメインの契約も更新を続ける

例:移転と同時にデザインや記事内容も大きく変えると、検索での変化が起きたときに原因を切り分けにくくなります。可能なら、URLの移転と内容の変更は時期を分けます。外部から張られたリンクの見方は「被リンクとは」で説明しています。

当サイト(seoagent.jp)の実例

当サイト(seoagent.jp)では、トップ / から日本語版 /ja/ への転送が302(一時的)になっていました。恒久的な構成のため301に変更し、旧サイト時代のURLも新しいURLへ1対1で301を設定しました。その後、検索エンジンに登録される前に日本語版をトップ / に置く構成に変え、/ja/ で始まる URL は対応するページへ1対1で301にしています。サイトの反映のたびに、この301を確認しています。

また、2010年ごろの旧サイトのページ /seoagent.htm に外部からのリンクが残っていたため、相当する現在のページであるトップ / へ301で転送しています。転送を確認したうえで、被リンクの調査ツールで有効な被リンクを約45件確認しましたが、ほとんどは自動生成のスパムで、否認は不要と判断しています。古いURLに残るリンクは、移転から何年たっても見つかることがある、という例です。

ほかのテクニカルSEOの記事は「テクニカルSEOの記事一覧」にまとめています。

よくある質問

301リダイレクトを設定すると、古いURLはいつ検索結果から消えますか。

Googleが古いURLを再びクロールし、転送に気づいたあとに新しいURLへ入れ替わります。かかる時間はサイトやページによって異なります。URL検査で新しいURLが登録されているかを確かめ、内部リンクやサイトマップも新しいURLにそろえておくと、入れ替わりを妨げません。

サブディレクトリへの移動にも、Search Consoleの「アドレス変更」ツールを使いますか。

使いません。Search Consoleのヘルプでは、アドレス変更ツールはドメイン単位のプロパティでだけ使え、パス(ディレクトリ)単位のプロパティは移せないと説明しています。ディレクトリの移動は、301リダイレクトと内部リンクの書き換えで対応します。

一度設定した301を、後から取り消せますか。

サーバーの設定は戻せますが、301はブラウザに記憶されることがあり、一度転送された人の環境では、設定を消した後も転送が続く場合があります。元に戻す可能性がある移動なら、最初から302を使います。

画像やPDFのURLも301で転送できますか。

できます。サーバーの設定(.htaccessやnginx)で、HTMLのページと同じように書けます。WordPressのプラグインの中には投稿や固定ページだけを対象にするものもあるため、ファイルの転送はcurl -Iで実際のステータスを確かめます。

SEOAGENTでできること

SEOAGENTでは、重なっている記事の整理や、記事同士の内部リンクの見直しを進められます。リダイレクトそのものの設定は、WordPressやサーバー側で行います。

参考情報

関連する記事

「テクニカルSEO」の記事をすべて見る →

クロールバジェットとは:Googleの説明と、気にすべきサイト・しなくてよいサイト
テクニカルSEO

クロールバジェットとは:Googleの説明と、気にすべきサイト・しなくてよいサイト

クロールバジェットは、多くのサイトでは気にする必要がありません。Google の「クロール バジェットの管理」の原文に沿って、決まる仕組み、対策が必要なサイトの目安、クロールの統計情報での確かめ方、クロールを無駄にする原因と対処を、当サイトの点検結果とあわせて説明します。

AIでSEO対策を、もっと続けやすく。

機能と使い方、料金・契約条件は、サービス資料でご案内します。