Apacheのmod_rewriteでURLをリダイレクト・リライトする方法|RewriteRuleの基本から実践パターンとデバッグまで

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > Webサーバー管理 > Apacheのmod_rewriteでURLをリダイレクト・リライトする方法|RewriteRuleの基本から実践パターンとデバッグまで
「.htaccessにRewriteRuleを書いたのに全く効かない」「HTTPSへのリダイレクトを設定しようとしたのに無限ループになった」。こうした状況でつまずいていないでしょうか。Apacheのmod_rewriteは、設定を一つ間違えると原因がわかりにくいのが難点です。

mod_rewriteはApache httpdに標準搭載されたURLリライトモジュールで、HTTPSリダイレクト・旧URL移転・スラッシュ統一といった現場で必要なURL制御をすべて実現できます。ただし「AllowOverride」設定の不備や「RewriteEngine On」の書き忘れが原因で「書いたのに動かない」状態に陥りやすいモジュールでもあります。

この記事では、mod_rewriteの有効化確認からRewriteRuleとRewriteCondの構文解説、よく使う実践パターン、そして「効かない時のデバッグ手順」まで、RHEL 9 / Ubuntu 24.04 LTSの実機で確認した手順を解説します。

この記事のポイント

・LoadModule確認とAllowOverride All設定が前提
・[R=301,L]フラグで301リダイレクトを実現
・RewriteCondでHTTPS強制・www統一などの条件付けが可能
・効かない時はLogLevel rewrite:trace3でデバッグ


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

mod_rewriteとは(役割とApache設定上の位置づけ)

mod_rewriteはApache httpdに組み込まれたURLリライトエンジンです。受信したHTTPリクエストのURLパスを正規表現でマッチさせ、別のURLに書き換える(リライト)またはクライアントにリダイレクトする仕組みを提供します。

設定は2か所に書けます。

・httpd.conf / VirtualHostブロック内:サーバー全体またはバーチャルホスト単位の設定。変更後にリロードが必要
・.htaccess:ディレクトリ単位の設定。リロード不要だがAllowOverrideが有効である必要がある

現場では「.htaccessに書いて即時反映できる」運用が多いですが、AllowOverrideの設定漏れが「書いたのに動かない」原因のほとんどを占めます。次のセクションで確認手順を説明します。

mod_rewriteを有効化する3ステップ

1. LoadModuleが有効かを確認する

まずmod_rewriteが組み込まれているかを確認します。

# RHEL 9 / CentOS 系 $ httpd -M 2>/dev/null | grep rewrite rewrite_module (shared) # Ubuntu 24.04 LTS 系 $ apache2ctl -M 2>/dev/null | grep rewrite rewrite_module (shared)

rewrite_module (shared)が表示されれば有効です。出力がなければ以下で有効化します。

# Ubuntu 系(a2enmod を使う) $ sudo a2enmod rewrite $ sudo systemctl restart apache2 # RHEL 系(conf.modules.d の LoadModule 行を確認) # /etc/httpd/conf.modules.d/00-base.conf LoadModule rewrite_module modules/mod_rewrite.so

2. AllowOverrideを設定する

.htaccessが機能するには、対象ディレクトリにAllowOverride All(またはAllowOverride FileInfo)が設定されている必要があります。

# /etc/httpd/conf/httpd.conf または VirtualHost ブロック <Directory "/var/www/html"> Options FollowSymLinks AllowOverride All Require all granted </Directory>

AllowOverride None(デフォルトの場合あり)のままだと.htaccessの設定が一切無視されます。設定後はhttpd -tで構文チェックを行い、リロードしてください。

$ sudo httpd -t Syntax OK $ sudo systemctl reload httpd

3. .htaccessにRewriteEngineをOnにする

.htaccessを使う場合、ファイルの先頭に必ずRewriteEngine Onを置きます。

# /var/www/html/.htaccess RewriteEngine On

これを忘れると後続のRewriteRuleはすべて無効になります。httpd の基本操作でApacheの設定構造を確認してから取り掛かると、全体像が把握しやすくなります。

RewriteRuleの基本構文

RewriteRuleの基本形は次のとおりです。

RewriteRule パターン 置換先 [フラグ]

パターンはリクエストURIに対する正規表現です。ドキュメントルートより後のパス部分がマッチ対象になります(先頭の/は含まない)。

フラグは角括弧に入れてカンマ区切りで複数指定できます。主なフラグは以下のとおりです。

・R=301:301(恒久移転)リダイレクト。R=302なら一時移転
・L:このルールで処理を終了する(Last。ループ防止のため重要)
・NC:大文字小文字を区別しない(No Case)
・QSA:元のクエリ文字列を追記する(Query String Append)

例として/old-pageを/new-pageに301リダイレクトするルールは以下です。

RewriteEngine On RewriteRule ^old-page/?$ /new-page [R=301,L]

/?はトレーリングスラッシュの有無に両対応するためのものです。Lフラグを忘れるとルールが連続して実行され、意図しないリダイレクトループが発生します。

RewriteCondで条件を追加する

RewriteCondはその直後のRewriteRuleを実行する条件を指定します。条件が偽の場合、RewriteRuleはスキップされます。

RewriteCond テスト変数 条件パターン [フラグ] RewriteRule パターン 置換先 [フラグ]

よく使うサーバー変数は次のとおりです。

・%{HTTPS}:onまたはoff(HTTPS接続かどうか)
・%{HTTP_HOST}:リクエストのHostヘッダー(例: example.com)
・%{REQUEST_URI}:リクエストのURIパス部分
・%{SERVER_PORT}:接続ポート番号(80または443)

条件パターンの先頭に!を付けると否定になります。!onは「onでない場合」を意味します。

よく使う実践パターン

1. HTTPSへの強制リダイレクト

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

%{HTTPS} !onでHTTPS以外の接続に限定し、全URLをHTTPS版にリダイレクトします。$1はパターン^(.*)$のキャプチャグループで元のパスを引き継ぎます。

ApacheよりもNginxやAWSロードバランサーを前段に置く構成では、実際のHTTPS接続がApacheにはHTTPとして届く場合があります。その場合はX-Forwarded-Protoヘッダーを条件にします。

# ロードバランサー配下の場合 RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

2. wwwあり/wwwなしの統一

# www なし → www ありに統一する場合 RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] # www あり → www なしに統一する場合 RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

%1はRewriteCondの1つ目のキャプチャグループ(ドメイン部分)を参照します。

3. 旧URLから新URLへの301移転

# 旧URLの例: /blog/old-article → /articles/new-article RewriteEngine On RewriteRule ^blog/old-article/?$ /articles/new-article [R=301,L]

サイトリニューアルで複数のURLを移転する際は1行ずつRewriteRuleを書きます。件数が多い場合はRewriteMapも利用できます。

4. トレーリングスラッシュの統一

# /page → /page/ にスラッシュを追加する(ファイルへのリクエストは除外) RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*[^/])$ /$1/ [R=301,L]

%{REQUEST_FILENAME} !-fでファイルへのリクエスト(.htmlや画像等)を除外します。ファイルにスラッシュを追加すると404になるためです。

Linuxサーバー上でApacheをはじめとするWebサーバーを本番環境に適切に設定する方法は、Linux Master Pro Seminarの実機ハンズオンで体系的に習得できます。

mod_rewriteが効かない時のトラブルシュート

1. AllowOverrideの設定を確認する

最初に確認すべきはAllowOverrideの設定です。

# httpd.conf で対象ディレクトリの設定を確認 $ grep -A3 'Directory "/var/www/html"' /etc/httpd/conf/httpd.conf <Directory "/var/www/html"> AllowOverride All ← All または FileInfo が必要

AllowOverride Noneになっていると.htaccessが一切読み込まれません。変更後はsystemctl reload httpdを忘れずに実行してください。

2. RewriteEngineがOnになっているか確認する

# .htaccess の先頭行を確認 $ head -3 /var/www/html/.htaccess RewriteEngine On ← この行がないと全ルールが無効

3. LogLevelでデバッグログを有効にする

設定が正しいはずなのに動かない場合は、LogLevelを上げてデバッグログを取得します。

# httpd.conf または VirtualHost ブロックに追記 LogLevel warn rewrite:trace3 # リロード $ sudo systemctl reload httpd # ログでマッチング状況を確認(RHEL 系) $ sudo tail -f /var/log/httpd/error_log | grep rewrite [Thu Oct 08 14:23:11.504103 2026] [rewrite:trace3] [pid 12345] mod_rewrite.c(475): applying pattern '^old-page/?$' to uri 'blog/old-article'

trace3にするとリクエストごとにルールのマッチング結果が記録されます。原因特定後は必ずwarnに戻してください(ログが大量になります)。

Apacheのタイムアウト設定やアクセスログ設定など他の設定との干渉がないかはApache タイムアウト設定の詳細も合わせて確認するとよいでしょう。

4. よくあるミスのチェックリスト

・Lフラグ忘れ:ルールが連続して実行されリダイレクトループが発生する
・HTTPSリダイレクトと旧URL移転の2つのR=301が連続している:順序や条件を整理する
・^(.*)$のパターンが広すぎて静的ファイルも書き換えている:%{REQUEST_FILENAME} !-fで除外する
・httpd.conf側のルールと.htaccessのルールが二重になっている:どちらか一方に統一する

本記事のまとめ

やりたいこと 設定のポイント
mod_rewriteを有効化する httpd -M | grep rewriteでモジュール確認。AllowOverride Allが必要
HTTPSへの強制リダイレクト RewriteCond %{HTTPS} !onの後にRewriteRuleを置く
旧URLを新URLへ301移転 RewriteRule ^旧パス/?$ /新パス [R=301,L]
www統一・スラッシュ統一 RewriteCond %{HTTP_HOST}でホスト名条件を追加する
設定が効かない AllowOverride確認 → RewriteEngine On確認 → LogLevel rewrite:trace3
mod_rewriteの基本を押さえることで、HTTPSリダイレクト・URL正規化・旧URL移転をApache上で一元管理できます。「AllowOverride AllになっているかどうかとRewriteEngine Onが書いてあるかどうかの2点」がトラブルの大半の原因ですので、まずそこから確認するのが最短ルートです。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Apache設定・セキュリティ設計・運用管理まで実機ハンズオンで学べるLinux Master Pro Seminarの詳細をご確認ください。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。