meta refresh タグでリダイレクトする
HTML だけでリダイレクトするには、古いページの <head> に <meta http-equiv="refresh"> タグを書きます。
<meta http-equiv="refresh" content="0; url=https://example.com/new-page">
数字は秒数の遅延で、その後にセミコロン、url= と移動先のアドレスが続きます。0 なら、ページが読み込まれるとすぐにリダイレクトします。下は「ページが移動しました」のファイル全体です。このプレビューが移動しないよう遅延を 1 時間にしていますが、実際のページでは 0 か数秒にします。
2 つの代わりの手段でページを安全にしています。見えるリンク (ブラウザが refresh に従わない人や、自分で選びたいスクリーンリーダーのユーザーのため) と、どの URL が本物かを検索エンジンに伝える <link rel="canonical"> です。ここで遅延を 0 に変えると、プレビュー自体が example.com に移動します。Reset を押すと例が戻ります。
ページを自動で更新する
URL を省くと、遅延の後にページが自分自身を再読み込みします。content="5" なら 5 秒ごとに再読み込みします。下の 1 つ目の箱はそのタグを持つ小さなページなので、様子を観察できます。読み込み時刻が 5 秒ごとに変わり、入力欄に入れたテキストは再読み込みで消えます。2 つ目の箱は代わりに JavaScript で時計を最新に保ち、入力したテキストも残ります。
refresh はページ全体をもう一度読み込むので、読者がそこでしていたことは中断されます。壁に掛けた状況表示の画面のように、誰も操作しないページなら問題ありません。ダッシュボード、スコア、フィードでは、2 つ目の箱のように変わる部分だけを更新しましょう。
JavaScript でリダイレクトする
リダイレクトがブラウザだけが知っていること (ユーザーの選択、ログイン状態、画面の大きさ) に左右されるときは、JavaScript を使います。
// Replaces the current page in the history: Back skips it
location.replace('https://example.com/new-page');
// Adds a history entry: Back returns to this page
location.href = 'https://example.com/new-page';
リダイレクトには、ほぼ常に location.replace が適しています。location.href だと、戻るボタンを押すとリダイレクトしたページに戻り、そこでまたリダイレクトされて、ユーザーは抜け出せなくなります。
サーバーでのリダイレクトを優先する
meta refresh やスクリプトは、ブラウザが古いページをダウンロードした後でしか動きません。サーバーでのリダイレクトは、HTML を送る前に、ステータスコードと新しいアドレスでリクエストに応答します。
- 301 (恒久的な移動) または 308: ページが完全に新しい場所に移った。検索エンジンは古い URL の評価を新しい URL に移します。
- 302 (発見) または 307: 一時的な移動。古い URL がメインのまま残ります。
設定方法はホスティングによって違います。よくある書き方をいくつか示します。
# Apache (.htaccess)
Redirect 301 /old-page https://example.com/new-page
# nginx (inside a server block)
location = /old-page { return 301 https://example.com/new-page; }
# Netlify or Cloudflare Pages (_redirects file)
/old-page /new-page 301
meta refresh は、リダイレクトのルールがない静的ホスティングのように、サーバーをまったく変更できないときに使いましょう。Google は即時の meta refresh を恒久的なリダイレクト、遅延のあるものを一時的なリダイレクトとして扱うので、遅延 0 のほうが 301 に近くなります。
時間指定のリダイレクトとアクセシビリティ
遅延のあるリダイレクトは、文の途中で読者を別のページに移動させてしまうことがあります。アクセシビリティのガイドライン (WCAG) は、時間指定のリダイレクトを不適合としています。即時のリダイレクトは問題ありません。どうしても待たせるなら、ページ上でそれを伝え (「10 秒後にリダイレクトします」)、自分のペースで移動できるよう、必ずリンクを用意しましょう。
よくある間違い
- リダイレクトのループ。 互いに refresh し合う 2 つのページは、読者を永遠に行き来させます。移動先のページがどこに転送するかを確認しましょう。
- 間違った場所を指す相対 URL。
url=new-pageは現在の URL を基準に解決されるので、/docs/oldからは/docs/new-pageに移動します。迷ったらurl=/new-pageのような完全なパスを使いましょう。 - 代わりのリンクがない。 body には必ず新しいページへの普通の リンク を置きましょう。
- リダイレクトに
location.hrefを使う。 戻るボタンがリダイレクトのループにつながります。location.replaceを使いましょう。 - サーバーを管理できるのに meta refresh を使う。 代わりに 301 を設定しましょう。速く、どのツールにもわかりやすくなります。
よくある質問
HTML のページを別のページにリダイレクトするには?
古いページの <head> に <meta http-equiv="refresh" content="0; url=https://example.com/new"> を追加し、代わりの手段として body に新しいページへの普通のリンクを置きます。サーバーを管理できるなら、301 リダイレクトのほうが適しています。
HTML で 5 秒後にリダイレクトするには?
セミコロンの前の数字を秒数の遅延にします: <meta http-equiv="refresh" content="5; url=https://example.com/new">。リダイレクトされることをページ上で読者に伝え、リンクも用意しましょう。
ページを自動で更新させるには?
URL なしで遅延だけを指定した meta refresh を使います。<meta http-equiv="refresh" content="30"> は 30 秒ごとにページを再読み込みします。ページ全体を再読み込みして読者の作業を中断させるので、リアルタイムのデータには、JavaScript でページの一部を更新するほうがたいてい適しています。
meta refresh のリダイレクトは SEO に悪いですか?
Google は meta refresh に従います。即時の meta refresh (遅延 0) は恒久的なリダイレクト、遅延のあるものは一時的なリダイレクトのように扱われます。それでも推奨はサーバー側の 301 です。速く、どのクローラーとブラウザも理解できるからです。
JavaScript でリダイレクトするには?
location.replace('https://example.com/new') を使います。履歴の現在のページを置き換えるので、戻るボタンでリダイレクトしたページに戻ることはありません。location.href = url でも動きますが、古いページが履歴に残ります。