.htaccessリダイレクト完全ガイド:301/302の使い分け・WordPress対応と実践設定例
.htaccessリダイレクトとは
.htaccessリダイレクトとは、Apache HTTP サーバーがサポートするディレクトリ単位の設定ファイル(.htaccess)に記述したルールを使って、訪問者や検索エンジンに対して URL を別の URL に転送(リダイレクト)する仕組みのことです。特にサイト移転、HTTP → HTTPS の強制、www 有無の統一、古いページの新しいページへの誘導などで広く使われます。
なぜ .htaccess でリダイレクトするのか
- サーバー側で直接リダイレクトを制御できるため、アプリケーションの変更なしに振る舞いを変えられる。
- SEO(検索エンジン最適化)上、恒久的な移転は 301 リダイレクトで通知するのが一般的。
- ディレクトリごとの設定が可能で、共有ホスティングなどでサーバー設定(httpd.conf)にアクセスできない場合に便利。
主なリダイレクトの種類(HTTP ステータス)
- 301 Moved Permanently(恒久的移転): 検索エンジンに対して恒久的な変更を伝える。キャッシュされやすい。
- 302 Found / 307 Temporary Redirect(一時的): 一時的な移転を示す(意図に応じて 302 か 307 を選択)。
- その他(303 See Other 等): 特定の用途向けだが、一般的なサイト移転では 301/302 が主流。
Apache での主要な方法:mod_alias と mod_rewrite
Apache では主に2つのモジュールを使ってリダイレクトを記述します。用途に応じて使い分けます。
- mod_alias(Redirect / RedirectMatch): シンプルで直感的。静的なパスのリダイレクトや単純な正規表現での置換に向く。例: Redirect 301 /old /new
- mod_rewrite(RewriteEngine / RewriteRule): 正規表現や条件(RewriteCond)を組み合わせた高度な制御が可能。パフォーマンス面ではより重いが柔軟。
基本的な記述例(.htaccess)
以下はよく使うパターンの例です。.htaccess に書く際は WordPress 等の既存ルールより前に置くのが一般的です(上書き回避のため)。
1) 単純な 301 リダイレクト(mod_alias)
Redirect 301 /old-page.html /new-page.html
この記述は /old-page.html へのリクエストを /new-page.html に恒久的に転送します。クエリ文字列は mod_alias では基本的に保持されます。
2) ドメイン全体を別のドメインへ転送(mod_rewrite)
RewriteEngine On
RewriteCond %{HTTP_HOST} !^new-example\.com$ [NC]
RewriteRule ^(.*)$ https://new-example.com/$1 [R=301,L]
すべてのホスト名・パスを https://new-example.com/ に 301 で転送します。
3) HTTP → HTTPS 強制(よく使われるパターン)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
HTTPS でないアクセスを HTTPS にリダイレクトします。ロードバランサやプロキシ配下では %{HTTP:X-Forwarded-Proto} を参照するなどの調整が必要です。
4) 非 www → www(またはその逆)
RewriteEngine On
# non-www -> www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
ホスト名の統一により重複コンテンツのリスクを低減します。
5) クエリ文字列を保持/追加する例(mod_rewrite)
# 元のクエリを保持する(QSA)
RewriteEngine On
RewriteRule ^old$ /new?utm=redirect [R=301,L,QSA]
RewriteRule はデフォルトで元のクエリ文字列を捨てるため、保持したい場合は QSA フラグを使います。
WordPress と .htaccess の注意点
- WordPress はデフォルトでパーマリンク機能のための rewrite ルールを .htaccess に書きます(# BEGIN WordPress / # END WordPress ブロック)。独自のリダイレクトはこのブロックの外側、通常はブロックの前に置くべきです。
- プラグイン(Redirection など)を使えば .htaccess を直接編集せずに管理できるが、数が増えるとプラグイン処理のオーバーヘッドや移行時の管理が課題になることも。
よくある落とし穴と対処法
- リダイレクトループ: 条件が不適切だと無限ループに陥る。テストは curl -I やブラウザの開発者ツールでヘッダを確認すること。
- ブラウザキャッシュ: 301 はブラウザにキャッシュされるため、テスト時は 302 で試す、もしくはブラウザキャッシュをクリアする。
- プロキシ/ロードバランサ環境: %{HTTPS} や %{REMOTE_ADDR} の値が期待と異なることがある。X-Forwarded-Proto 等を使う必要あり。
- Nginx 環境では .htaccess を無視する(サポート外)。Nginx はサーバ設定で書く必要がある。
- エンコードやスラッシュの扱い: 正規表現のミスやエスケープ不足で意図しないマッチをすることがある。
パフォーマンスと運用上のベストプラクティス
- .htaccess はディレクトリごとに読み込まれ、Apache はリクエストごとに上位ディレクトリまで検索するため、設定は可能ならメインのサーバー設定(httpd.conf)に移すと若干高速化できる。
- シンプルなルール(mod_alias)を優先する。複雑な正規表現や多段の RewriteCond はパフォーマンスへ影響する。
- リダイレクトの目的(SEO、ユーザー導線、一時対応)を明確にし、適切なステータスコード(301/302)を選ぶ。
- 大規模な URL 移行やドメイン移転では、サーチコンソール/Bing Webmaster 等にサイト移転を通知し、サーバー側で 301 を正確に設定する。
テストと確認方法
- curl -I https://example.com/old -L でリダイレクト経路と最終ステータスを確認する。
- オンラインのリダイレクトチェッカー(例: httpstatus.io)で複数段のリダイレクトを可視化する。
- ブラウザの開発者ツールの Network タブで Location ヘッダやステータスを確認する。
- 検索エンジンのインデックス状況は Search Console 等で確認し、必要に応じて再クロールを促す。
まとめ(実務上の指針)
- 単純なリダイレクトは mod_alias(Redirect)で簡潔に、複雑な条件や正規表現が必要な場合は mod_rewrite を利用する。
- WordPress 等を使っている場合は、既存の .htaccess ブロックとの順序に注意してルールを配置する。
- HTTP ステータスコードは意図に合わせて正しく使い、テストは必ず行う(ブラウザキャッシュやプロキシの影響に注意)。
- 可能ならサーバ基本設定に移行し、.htaccess の過剰利用は避ける(パフォーマンスと管理性の観点から)。
参考文献
- Apache: mod_rewrite — Apache HTTP Server Version 2.4 Documentation
- Apache: mod_alias — Apache HTTP Server Version 2.4 Documentation
- WordPress.org: .htaccess ファイルの使用(公式ドキュメント)
- Google Search Central: Move a site with URL changes
- Google Search Central: Use 301 redirects


