Webサイトを運営していると、リダイレクトが必要になる場面がありますよね。
例えば:
- 古いURLから新しいURLに自動で転送したい
- httpからhttpsに自動で切り替えたい
- wwwあり・なしを統一したい
- ドメインを変更したので転送したい
こうした「自動転送」を実現するのがリダイレクトです。
Apache Webサーバーでは、複数の方法でリダイレクトを設定できます。
この記事では、Apacheでのリダイレクト設定方法を、初心者の方にも分かりやすく解説していきます。
主な方法は:
- .htaccessファイルを使う方法(手軽、推奨)
- httpd.conf(設定ファイル)を使う方法(高速、上級者向け)
- mod_rewriteを使った高度な設定
それぞれの特徴と具体的な設定例を紹介していきますよ。
リダイレクトの基本を理解しよう

まずは、リダイレクトの基本について押さえておきましょう。
リダイレクトとは?
リダイレクト(Redirect)は、訪問者が特定のURLにアクセスした時に、別のURLに自動的に転送する仕組みです。
例えば:
訪問者が http://example.com/old.html にアクセス
↓
自動的に http://example.com/new.html に転送
訪問者は気づかないうちに、新しいページに誘導されるわけですね。
なぜリダイレクトが必要?
リダイレクトが必要になる主な理由:
1. サイトの移転・URL変更
- ドメインを変更した
- ディレクトリ構造を変更した
- ページのファイル名を変更した
2. SEO対策
- wwwあり・なしを統一
- 重複コンテンツを防ぐ
- ページランクを引き継ぐ
3. セキュリティ対策
- httpからhttpsへの強制転送
- SSL化の推進
4. ユーザビリティ向上
- スマホ専用ページへの転送
- 言語別ページへの振り分け
リダイレクトの種類
主に2種類のリダイレクトがあります。
301リダイレクト(恒久的な移転)
「このページは永久に新しい場所に移動しました」という意味。
- SEOの評価を引き継ぐ(最も重要)
- ブックマークが更新される
- 検索エンジンがインデックスを更新
使うべき場面:
- サイト移転
- URL構造の恒久的な変更
- ドメイン変更
302リダイレクト(一時的な移転)
「このページは一時的に別の場所にあります」という意味。
- SEOの評価は引き継がれない
- 一時的な措置として使用
使うべき場面:
- メンテナンス中の一時転送
- キャンペーンページへの一時誘導
- ABテスト
基本的には301リダイレクトを使うのが推奨されます。
方法1:.htaccessでリダイレクト(最も簡単)
最も手軽で一般的な方法が、.htaccessファイルを使う方法です。
.htaccessとは?
.htaccessは、ディレクトリ単位でApacheの設定を変更できるファイルです。
サーバーの設定ファイルを直接編集する権限がない共有サーバーでも使えるのが特徴ですね。
.htaccessファイルの配置場所
Webサイトのルートディレクトリ(通常は公開ディレクトリ)に配置します。
/var/www/html/.htaccess
または
/home/ユーザー名/public_html/.htaccess
既に.htaccessファイルがある場合は、既存の内容に追記します。
Redirectディレクティブを使った基本的な設定
最もシンプルな方法は、Redirectディレクティブを使うことです。
基本構文:
Redirect [ステータスコード] [転送元パス] [転送先URL]
例1:特定のページを転送
Redirect 301 /old-page.html https://example.com/new-page.html
この設定で:
https://example.com/old-page.htmlにアクセスするとhttps://example.com/new-page.htmlに転送される
例2:ディレクトリごと転送
Redirect 301 /old-directory/ https://example.com/new-directory/
/old-directory/以下のすべてのページが、/new-directory/に転送されます。
例3:別ドメインへの転送
Redirect 301 / https://new-domain.com/
サイト全体を新しいドメインに転送します。
RedirectMatchで正規表現を使う
RedirectMatchを使うと、正規表現でより柔軟な転送ができます。
例1:拡張子を変更
RedirectMatch 301 (.*)\.html$ https://example.com$1.php
すべての.htmlファイルを.phpに転送します。
例2:特定のパターンを転送
RedirectMatch 301 ^/blog/([0-9]+)/(.*)$ https://example.com/article/$1/$2
/blog/123/titleを/article/123/titleに転送します。
方法2:mod_rewriteを使った高度なリダイレクト
より複雑な条件でリダイレクトしたい場合は、mod_rewriteモジュールを使います。
mod_rewriteとは?
ApacheのURLリライト(書き換え)モジュールで、非常に強力で柔軟な設定ができます。
ただし、少し複雑なので、基本的なリダイレクトには前述のRedirectで十分です。
mod_rewriteの基本構文
RewriteEngine On
RewriteCond [テスト文字列] [条件パターン] [フラグ]
RewriteRule [パターン] [置換] [フラグ]
RewriteEngine On:mod_rewriteを有効化
RewriteCond:条件を指定(オプション)
RewriteRule:書き換えルールを指定
httpからhttpsへのリダイレクト
最も一般的な使用例です。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
解説:
%{HTTPS} off:HTTPSでない場合^(.*)$:すべてのURLhttps://%{HTTP_HOST}/$1:HTTPSバージョンに置き換え[R=301,L]:301リダイレクト、これが最後のルール
wwwあり・なしの統一
wwwなしに統一:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
wwwありに統一:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
[NC]は「大文字小文字を区別しない」という意味です。
httpからhttps、かつwwwなしに統一
両方を同時に実現する設定:
RewriteEngine On
# まずhttpsに転送
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
# 次にwwwを削除
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
特定のIPアドレスを除外してリダイレクト
メンテナンス中に管理者だけアクセスを許可する場合:
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.100$
RewriteRule ^(.*)$ https://example.com/maintenance.html [R=302,L]
192.168.1.100からのアクセス以外は、メンテナンスページに転送されます。
モバイルユーザーをスマホページに転送
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (iPhone|Android|Mobile) [NC]
RewriteRule ^(.*)$ https://m.example.com/$1 [R=302,L]
モバイル端末からのアクセスをモバイル専用サイトに転送します。
古いURLパターンを新しい構造に転送
RewriteEngine On
RewriteRule ^old-category/([^/]+)\.html$ /new-category/$1/ [R=301,L]
/old-category/article.htmlを/new-category/article/に転送します。
方法3:httpd.confでリダイレクト設定
サーバーの設定ファイルで直接設定する方法です。
httpd.confとは?
Apacheのメイン設定ファイルです。
通常の場所:
/etc/httpd/conf/httpd.conf(RHEL系)/etc/apache2/apache2.conf(Debian系)/usr/local/etc/apache24/httpd.conf(FreeBSD)
VirtualHost内での設定
バーチャルホストごとに設定できます。
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
# httpからhttpsへリダイレクト
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
# SSL設定
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem
DocumentRoot /var/www/html
</VirtualHost>
Directory単位での設定
特定のディレクトリにのみ適用:
<Directory "/var/www/html/old-section">
RewriteEngine On
RewriteRule ^(.*)$ https://example.com/new-section/$1 [R=301,L]
</Directory>
httpd.confの利点と注意点
利点:
- .htaccessより高速(毎回ファイルを読む必要がない)
- サーバー全体で統一した設定
- より詳細な制御
注意点:
- root権限が必要
- 設定変更後はApacheの再起動が必要
- 共有サーバーでは使えないことが多い
Apacheの再起動方法:
# 設定のテスト
sudo apachectl configtest
# 再起動
sudo systemctl restart httpd
# または
sudo systemctl restart apache2
よくあるリダイレクト設定例

実際によく使われる設定パターンを紹介します。
1. サイト全体をhttpsに転送
# .htaccess
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
2. 旧ドメインから新ドメインに転送
# .htaccess
RewriteEngine On
RewriteCond %{HTTP_HOST} ^old-domain\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www\.old-domain\.com$ [NC]
RewriteRule ^(.*)$ https://new-domain.com/$1 [R=301,L]
3. index.htmlやindex.phpを非表示に
# .htaccess
RewriteEngine On
RewriteCond %{THE_REQUEST} /index\.(html|php) [NC]
RewriteRule ^(.*)index\.(html|php)$ /$1 [R=301,L]
https://example.com/index.htmlにアクセスすると、https://example.com/にリダイレクトされます。
4. 末尾のスラッシュを統一
スラッシュを追加:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ $1/ [R=301,L]
スラッシュを削除:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]
5. 特定のファイルタイプをブロック
<FilesMatch "\.(bak|config|sql|log)$">
Redirect 403
</FilesMatch>
または
RewriteEngine On
RewriteRule \.(bak|config|sql|log)$ - [F]
6. クエリパラメータを保持して転送
RewriteEngine On
RewriteRule ^old-page\.html$ /new-page.html [R=301,QSA,L]
[QSA]フラグで、クエリ文字列(?id=123など)を保持します。
7. 複数のページを1つのページにまとめる
RewriteEngine On
RewriteRule ^(page1|page2|page3)\.html$ /combined-page.html [R=301,L]
8. ディレクトリの一覧表示を防ぐ
Options -Indexes
または、リダイレクト:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ / [R=301,L]
リダイレクトループの回避
設定ミスで起こりやすいリダイレクトループを防ぐ方法です。
リダイレクトループとは?
AからBにリダイレクト、BからAにリダイレクト…と無限ループになる状態です。
ブラウザに「リダイレクトが多すぎます」というエラーが表示されます。
原因と対策
原因1:条件が不十分
# 悪い例
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
これだと、既にhttpsでも再度リダイレクトしてしまいます。
良い例:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
HTTPSでない場合だけリダイレクトします。
原因2:.htaccessの重複
複数のディレクトリに.htaccessがあり、重複したリダイレクト設定がある場合。
対策:
- 不要な.htaccessを削除
- 設定を1箇所にまとめる
原因3:外部ツールとの競合
WordPressなどのCMS、またはCloudflareなどのCDNが独自のリダイレクトを設定している場合。
対策:
- 各ツールの設定を確認
- 重複する設定を削除
リダイレクトの確認とテスト
設定が正しく動作しているか確認する方法です。
ブラウザでの確認
最も簡単な方法:
- 古いURLにアクセス
- 新しいURLに転送されるか確認
- ブラウザのアドレスバーでURLを確認
HTTPステータスコードの確認
開発者ツールで確認:
- ブラウザでF12キーを押す
- 「ネットワーク」タブを開く
- 対象URLにアクセス
- ステータスコードを確認
- 301:恒久的リダイレクト(正しい)
- 302:一時的リダイレクト
- 200:リダイレクトされていない
コマンドラインでの確認
curlコマンド:
curl -I https://example.com/old-page.html
出力例:
HTTP/1.1 301 Moved Permanently
Location: https://example.com/new-page.html
301 Moved Permanentlyと表示されればOKです。
-Lオプションでリダイレクト先も表示:
curl -IL https://example.com/old-page.html
オンラインツールでの確認
便利なツール:
- Redirect Checker(各種オンラインサービス)
- Google Search Console(リダイレクトエラーの検出)
- Screaming Frog(サイト全体のリダイレクトチェック)
これらのツールで、リダイレクトチェーンやエラーを検出できます。
トラブルシューティング
よくある問題と解決方法です。
問題1:リダイレクトが効かない
確認ポイント:
ステップ1:.htaccessが有効か確認
httpd.confでAllowOverrideが設定されているか:
<Directory "/var/www/html">
AllowOverride All
</Directory>
AllowOverride Noneだと.htaccessが無効化されます。
ステップ2:mod_rewriteが有効か確認
apache2ctl -M | grep rewrite
# または
httpd -M | grep rewrite
rewrite_moduleが表示されればOK。
表示されない場合は有効化:
# Debian/Ubuntu
sudo a2enmod rewrite
sudo systemctl restart apache2
# RHEL/CentOS/AlmaLinux
# httpd.confで以下の行のコメントを外す
LoadModule rewrite_module modules/mod_rewrite.so
sudo systemctl restart httpd
ステップ3:構文エラーの確認
sudo apachectl configtest
エラーがないか確認します。
問題2:ブラウザのキャッシュが残っている
解決方法:
ブラウザのキャッシュをクリア:
- Chrome/Edge:Ctrl + Shift + Delete
- Firefox:Ctrl + Shift + Delete
- シークレットモードで確認
または、強制リロード:
- Windows:Ctrl + F5
- Mac:Command + Shift + R
問題3:リダイレクトチェーンが長い
A → B → C → D のような多段リダイレクトは、SEOに悪影響を与えます。
解決方法:
すべて最終的な目的地に直接リダイレクト:
# 悪い例
Redirect 301 /old1 /old2
Redirect 301 /old2 /new
# 良い例
Redirect 301 /old1 /new
Redirect 301 /old2 /new
問題4:wwwありとなしが両方残っている
解決方法:
Search Consoleで優先するドメインを設定し、.htaccessで統一:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
問題5:一部のページだけリダイレクトされない
確認ポイント:
- RewriteRuleの順序(上から順に評価される)
- RewriteCondの条件が正しいか
[L]フラグで処理を終了させているか
セキュリティとパフォーマンスの考慮
セキュリティ面の注意点
1. オープンリダイレクト脆弱性を防ぐ
ユーザー入力をリダイレクト先に使わない:
# 危険な例(使用禁止)
RewriteRule ^redirect\.php$ %{QUERY_STRING} [R,L]
攻撃者が任意のサイトに誘導できてしまいます。
2. HTTPSへの強制転送
すべてのページをHTTPSにリダイレクト:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
パフォーマンスの最適化
1. httpd.confを使う
可能であれば、.htaccessではなくhttpd.confで設定すると高速です。
2. 不要なRewriteCondを減らす
複雑すぎる条件は処理速度を低下させます。
3. リダイレクトチェーンを避ける
多段リダイレクトは、ページ表示速度を遅くします。
まとめ:目的に合わせてリダイレクト方法を選ぼう
Apacheでのリダイレクト設定について、重要なポイントをまとめます。
主な設定方法:
1. Redirectディレクティブ(シンプル)
Redirect 301 /old.html https://example.com/new.html
- 最も簡単
- 基本的なリダイレクトに十分
2. mod_rewrite(高度)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
- 条件付きリダイレクト
- 正規表現が使える
- 柔軟な制御
リダイレクトの種類:
- 301:恒久的(SEO評価を引き継ぐ)← 基本的にこれを使う
- 302:一時的(SEO評価は引き継がない)
よくある用途:
- httpからhttpsへの転送
- wwwあり・なしの統一
- 旧URLから新URLへの転送
- サイト移転
- モバイル対応
設定場所:
- .htaccess:手軽、共有サーバーでも使える
- httpd.conf:高速、root権限が必要
確認方法:
- ブラウザの開発者ツール
- curlコマンド
- オンラインツール
注意点:
- リダイレクトループに注意
- ブラウザキャッシュをクリア
- ステータスコードを確認
- リダイレクトチェーンを避ける
- セキュリティを考慮
トラブル時のチェック:
- mod_rewriteが有効か
- AllowOverrideが設定されているか
- 構文エラーがないか
- ブラウザキャッシュが残っていないか
Apacheのリダイレクト設定は、Webサイト運営の基本スキルです。
サイトのURL変更、HTTPS化、SEO対策など、さまざまな場面で必要になります。
この記事で紹介した基本的な設定パターンを押さえておけば、ほとんどのケースに対応できるはずです。
最初はシンプルなRedirectディレクティブから始めて、必要に応じてmod_rewriteの高度な機能を使っていくのがおすすめですよ。
正しいリダイレクト設定で、ユーザーにもSEOにも優しいWebサイトを作っていきましょう!

コメント