2026年6月3日
2026年6月3日
mod_rewriteのRewriteCond・RewriteRuleの書き方
はじめに
mod_rewriteはApache HTTP Serverで使用される強力なURLリライト機能を提供します。この機能を使って、サーバー側でのURL変換やリダイレクトが可能になり、ユーザーエンジャージメントの向上やSEO対策など、さまざまな用途に活用できます。
症状・背景
mod_rewriteが必要になる主な場面:
- ログインページへのアクセスを制限する
- 特定のドメインからのトラフィックのみを許可する
- URLのスラッグ化や簡略化を行う
- 旧URLから新URLへのリダイレクト実行
手順・設定方法
ステップ1: RewriteEngineを有効にする
# mod_rewrite機能を使用可能にします
<IfModule mod_rewrite.c>
RewriteEngine On
</IfModule>
# レコードとルールの追加
ステップ2: RewriteCondによる条件判定
# 条件に基づいてルールを適用するための設定です
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
ステップ3: RewriteRuleによるルーティング制御
# URLリライトを行うルールを定義します
RewriteRule ^oldpage\.html$ /newpage.html [R=301,L]
# 以下は、特定のパスが存在しない場合に404エラーを返す例です
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
ステップ4: リダイレクトとスラッグ化
# サブディレクトリを削除するためのリダイレクト
RewriteCond %{THE_REQUEST} \s/+(.*?)/{2,}(.*?\?.*) HTTP/
RewriteRule ^ /%1%2 [R=301,L]
# ブラケットを削除してスラッグ化する例
RewriteCond %{REQUEST_URI} \[([^\]\/]+)\]$
RewriteRule . - [E=SANS_BRACKETS:%1]
RewriteRule ^(.*)$ /$1?%{ENV:SANS_BRACKETS} [L,NC,QSA]
ステップ5: 実践的なトラブルシュート
# 重複したルールを確認する
RewriteCond %{THE_REQUEST} \s/+\?q=([^&]+) HTTP/
RewriteRule ^ /search?query=%1 [R,L]
注意事項
- デバッグ用に
[NC],[L],[R=301]などのフラグを適切に使用すること。 - セキュリティ上、無害なURLのみを処理するための条件設定を行うこと。
- 重複したルールは性能低下の原因となる場合があるので確認すること。
まとめ
1. RewriteEngine: mod_rewrite機能を使用可能にする
2. RewriteCond: レコードが適用される条件を指定する
3. RewriteRule: URLリライトを行うためのルールを定義する
4. リダイレクト: 特定の状況でのリダイレクトを実行する
5. スラッグ化: URLを簡素化し、SEO対策をする
関連記事: