Apacheでリダイレクト設定する方法|.htaccessとmod_rewriteを完全解説

Web

Webサイトを運営していると、リダイレクトが必要になる場面がありますよね。

例えば:

  • 古いURLから新しいURLに自動で転送したい
  • httpからhttpsに自動で切り替えたい
  • wwwあり・なしを統一したい
  • ドメインを変更したので転送したい

こうした「自動転送」を実現するのがリダイレクトです。

Apache Webサーバーでは、複数の方法でリダイレクトを設定できます。

この記事では、Apacheでのリダイレクト設定方法を、初心者の方にも分かりやすく解説していきます。

主な方法は:

  • .htaccessファイルを使う方法(手軽、推奨)
  • httpd.conf(設定ファイル)を使う方法(高速、上級者向け)
  • mod_rewriteを使った高度な設定

それぞれの特徴と具体的な設定例を紹介していきますよ。

スポンサーリンク
  1. リダイレクトの基本を理解しよう
    1. リダイレクトとは?
    2. なぜリダイレクトが必要?
    3. リダイレクトの種類
  2. 方法1:.htaccessでリダイレクト(最も簡単)
    1. .htaccessとは?
    2. .htaccessファイルの配置場所
    3. Redirectディレクティブを使った基本的な設定
    4. RedirectMatchで正規表現を使う
  3. 方法2:mod_rewriteを使った高度なリダイレクト
    1. mod_rewriteとは?
    2. mod_rewriteの基本構文
    3. httpからhttpsへのリダイレクト
    4. wwwあり・なしの統一
    5. httpからhttps、かつwwwなしに統一
    6. 特定のIPアドレスを除外してリダイレクト
    7. モバイルユーザーをスマホページに転送
    8. 古いURLパターンを新しい構造に転送
  4. 方法3:httpd.confでリダイレクト設定
    1. httpd.confとは?
    2. VirtualHost内での設定
    3. Directory単位での設定
    4. httpd.confの利点と注意点
  5. よくあるリダイレクト設定例
    1. 1. サイト全体をhttpsに転送
    2. 2. 旧ドメインから新ドメインに転送
    3. 3. index.htmlやindex.phpを非表示に
    4. 4. 末尾のスラッシュを統一
    5. 5. 特定のファイルタイプをブロック
    6. 6. クエリパラメータを保持して転送
    7. 7. 複数のページを1つのページにまとめる
    8. 8. ディレクトリの一覧表示を防ぐ
  6. リダイレクトループの回避
    1. リダイレクトループとは?
    2. 原因と対策
  7. リダイレクトの確認とテスト
    1. ブラウザでの確認
    2. HTTPステータスコードの確認
    3. コマンドラインでの確認
    4. オンラインツールでの確認
  8. トラブルシューティング
    1. 問題1:リダイレクトが効かない
    2. 問題2:ブラウザのキャッシュが残っている
    3. 問題3:リダイレクトチェーンが長い
    4. 問題4:wwwありとなしが両方残っている
    5. 問題5:一部のページだけリダイレクトされない
  9. セキュリティとパフォーマンスの考慮
    1. セキュリティ面の注意点
    2. パフォーマンスの最適化
  10. まとめ:目的に合わせてリダイレクト方法を選ぼう

リダイレクトの基本を理解しよう

まずは、リダイレクトの基本について押さえておきましょう。

リダイレクトとは?

リダイレクト(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でない場合
  • ^(.*)$:すべてのURL
  • https://%{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が独自のリダイレクトを設定している場合。

対策:

  • 各ツールの設定を確認
  • 重複する設定を削除

リダイレクトの確認とテスト

設定が正しく動作しているか確認する方法です。

ブラウザでの確認

最も簡単な方法:

  1. 古いURLにアクセス
  2. 新しいURLに転送されるか確認
  3. ブラウザのアドレスバーでURLを確認

HTTPステータスコードの確認

開発者ツールで確認:

  1. ブラウザでF12キーを押す
  2. 「ネットワーク」タブを開く
  3. 対象URLにアクセス
  4. ステータスコードを確認
  • 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サイトを作っていきましょう!

コメント

タイトルとURLをコピーしました