Apache mod_rewriteの仕組み、設定方法、動作確認の方法などについてまとめました。
※目次をクリックすると目次の下部にコンテンツが表示されます。
簡単な設定例で動作確認
1)環境の準備
・ディレクトリ
/php/mod_rewrite/
・ファイル
/php/mod_rewrite/.htaccess
/php/mod_rewrite/user.php
・user.phpの内容
<?php
$id = $_GET[‘id’];
echo “user=” . $id;
?>
・Apacheのhttpd.conf
.htaccessファイルを使用できるようにする
AllowOverride FileInfo
リライトログを出力する
RewriteLog “logs/rewrite.log”
RewriteLogLevel 2
2).htaccess内にリライトの設定
RewriteEngine on
RewriteRule ^user/(\w+)/?$ user.php?id=$1
※正規表現の説明
^ 入力の先頭
(\w) 単語構成文字。マッチした文字は$1に保持。
/? ”/”はオプション。ついても1つついてもOK。
$ 入力の末尾
3)動作確認
http://localhost/php/mod_rewrite/user/ → マッチしない
http://localhost/php/mod_rewrite/user/tom → マッチ
http://localhost/php/mod_rewrite/user/tom/ → マッチ
http://localhost/php/mod_rewrite/user/tom/new → マッチしない
・ディレクトリ
/php/mod_rewrite/
・ファイル
/php/mod_rewrite/.htaccess
/php/mod_rewrite/user.php
・user.phpの内容
<?php
$id = $_GET[‘id’];
echo “user=” . $id;
?>
・Apacheのhttpd.conf
.htaccessファイルを使用できるようにする
AllowOverride FileInfo
リライトログを出力する
RewriteLog “logs/rewrite.log”
RewriteLogLevel 2
2).htaccess内にリライトの設定
RewriteEngine on
RewriteRule ^user/(\w+)/?$ user.php?id=$1
※正規表現の説明
^ 入力の先頭
(\w) 単語構成文字。マッチした文字は$1に保持。
/? ”/”はオプション。ついても1つついてもOK。
$ 入力の末尾
3)動作確認
http://localhost/php/mod_rewrite/user/ → マッチしない
http://localhost/php/mod_rewrite/user/tom → マッチ
http://localhost/php/mod_rewrite/user/tom/ → マッチ
http://localhost/php/mod_rewrite/user/tom/new → マッチしない
RewriteRuleとRewriteCondの構文
1)RewriteRuleの書式
RewriteRule Pattern Substitution [flags]
①Pattern
・URL部に対する正規表現。
②Substitution
・パターンにマッチした部分を置換。
・絶対パスを指定。
・フルURLへリダイレクト。
・”-“を指定して何もしない。
③flags
・forbidden|F
・last|L
・redirect|R[=code]
・nocase|NC
・proxy|P
・その他HTTPヘッダーを設定
2)RewriteCondの書式
RewriteCond TestString CondPattern [flags]
①TestString
・%{VARIABLE}のフォーマットでサーバー変数を指定。
②CondPattern
・正規表現
・文字列比較
・ファイルやパスのテスト
③flags
・’nocase|NC’ (no case)
・’ornext|OR’ (or next condition)
・’novary|NV’ (no vary)
RewriteRule Pattern Substitution [flags]
①Pattern
・URL部に対する正規表現。
②Substitution
・パターンにマッチした部分を置換。
・絶対パスを指定。
・フルURLへリダイレクト。
・”-“を指定して何もしない。
③flags
・forbidden|F
・last|L
・redirect|R[=code]
・nocase|NC
・proxy|P
・その他HTTPヘッダーを設定
2)RewriteCondの書式
RewriteCond TestString CondPattern [flags]
①TestString
・%{VARIABLE}のフォーマットでサーバー変数を指定。
②CondPattern
・正規表現
・文字列比較
・ファイルやパスのテスト
③flags
・’nocase|NC’ (no case)
・’ornext|OR’ (or next condition)
・’novary|NV’ (no vary)
mod_rewrite設定の注意点、処理フロー
1)主なサーバー変数
例)下記リクエストの場合にサーバー変数に割り当てられる内容
GET /user.php?id=tom HTTP/1.1
%{THE_REQUEST}:GET /user.php?id=tom HTTP/1.1
%{REQUEST_METHOD}:GET
%{REQUEST_PROTOCOL}:HTTP
%{QUERY_STRING}:id=tom
%{REQUEST_URI}:/user.php
2)設定例
php/mod_rewriteディレクトリ内の.htaccessファイルに設定
RewriteEngine on
RewriteRule ^user/(\w+)/?$ user.php?id=$1
RewriteCond %{THE_REQUEST} user\.php
RewriteRule ^user\.php – [F]
3)設定時の注意点
・上から順番に処理される。
・ <Directory>セクションや.htaccess内に設定した場合は、先頭のスラッシュは除去される。
・RewriteRuleでマッチングされるのは、URLのパス部分でクエリストリング以降は含まれない。mod_rewriteディレクトリ内の.htaccessで”http://localhost/php/mod_rewrite/user.php?id=tom”の場合は、”user.php”がチェック対象のURL。
ホスト名、ポート番号、クエリストリングをチェックしたい場合は、RewriteCondで設定する。
・RewriteCondは一つのRewriteRuleに結びつけられ、RewriteRuleより前に記述する。
・RewriteRuleによってURLが書き換えられ、次のRewriteRuleに処理が進んだ場合、書き換えられたURLを使ってチェックされる。
4)処理フローの概要
①URLがRewriteRuleで指定したパターンにマッチし、該当するRewriteRuleに結び付けられたすべてのRewriteCondで指定した条件を満たした場合、RewriteRuleで設定したパターンにURLが書き換えられる。
②次のRewriteRuleがある場合は、書き換えられたURLを使って同様に処理される。
5)動作確認
①http://localhost/php/mod_rewrite/user/tom/のURLでリクエスト
●1番目のルール
“user/tom/”がRewriteRuleのパターンにマッチし、user.php?id=tomに変換。
●2番目ルール
上記①で書き換えられた”user.php?id=tom”のうち、クエリストリングの前までのパス”user.php”を使ってRewriteRuleのパターンをチェック。
RewriteRuleで指定したパターンにはマッチするが、RewriteCondで指定した%{THE_REQUEST}(GET /php/mod_rewrite/user/tom/ HTTP/1.1)の条件を満たさないので適用されない。
②http://localhost/php/mod_rewrite/user.php?id=tomのURLでリクエスト
●1番目のルール
“user.php”がRewriteRuleで指定したパターンにはマッチしない。
●2番目ルール
RewriteRuleで指定したパターンにマッチし、RewriteCondで指定した条件も満たすのでRewriteRuleが適用される。Fフラグ指定されているのでForbiddenでアクセスが拒否される。
例)下記リクエストの場合にサーバー変数に割り当てられる内容
GET /user.php?id=tom HTTP/1.1
%{THE_REQUEST}:GET /user.php?id=tom HTTP/1.1
%{REQUEST_METHOD}:GET
%{REQUEST_PROTOCOL}:HTTP
%{QUERY_STRING}:id=tom
%{REQUEST_URI}:/user.php
2)設定例
php/mod_rewriteディレクトリ内の.htaccessファイルに設定
RewriteEngine on
RewriteRule ^user/(\w+)/?$ user.php?id=$1
RewriteCond %{THE_REQUEST} user\.php
RewriteRule ^user\.php – [F]
3)設定時の注意点
・上から順番に処理される。
・ <Directory>セクションや.htaccess内に設定した場合は、先頭のスラッシュは除去される。
・RewriteRuleでマッチングされるのは、URLのパス部分でクエリストリング以降は含まれない。mod_rewriteディレクトリ内の.htaccessで”http://localhost/php/mod_rewrite/user.php?id=tom”の場合は、”user.php”がチェック対象のURL。
ホスト名、ポート番号、クエリストリングをチェックしたい場合は、RewriteCondで設定する。
・RewriteCondは一つのRewriteRuleに結びつけられ、RewriteRuleより前に記述する。
・RewriteRuleによってURLが書き換えられ、次のRewriteRuleに処理が進んだ場合、書き換えられたURLを使ってチェックされる。
4)処理フローの概要
①URLがRewriteRuleで指定したパターンにマッチし、該当するRewriteRuleに結び付けられたすべてのRewriteCondで指定した条件を満たした場合、RewriteRuleで設定したパターンにURLが書き換えられる。
②次のRewriteRuleがある場合は、書き換えられたURLを使って同様に処理される。
5)動作確認
①http://localhost/php/mod_rewrite/user/tom/のURLでリクエスト
●1番目のルール
“user/tom/”がRewriteRuleのパターンにマッチし、user.php?id=tomに変換。
●2番目ルール
上記①で書き換えられた”user.php?id=tom”のうち、クエリストリングの前までのパス”user.php”を使ってRewriteRuleのパターンをチェック。
RewriteRuleで指定したパターンにはマッチするが、RewriteCondで指定した%{THE_REQUEST}(GET /php/mod_rewrite/user/tom/ HTTP/1.1)の条件を満たさないので適用されない。
②http://localhost/php/mod_rewrite/user.php?id=tomのURLでリクエスト
●1番目のルール
“user.php”がRewriteRuleで指定したパターンにはマッチしない。
●2番目ルール
RewriteRuleで指定したパターンにマッチし、RewriteCondで指定した条件も満たすのでRewriteRuleが適用される。Fフラグ指定されているのでForbiddenでアクセスが拒否される。
-
インストール、設定全般、運用
- Apacheのインストール
- Apache初期設定確認
- Apacheの静的、DSOモジュールの確認、インストール方法
- Apacheでconf.dディレクトリ内の設定ファイルのインクルードに注意
- Apacheのhttpdサービスの使用方法
- WordPressパーマリンク設定時のApache設定
- Apache mod_rewriteの仕組み、設定方法、動作確認
- Apacheで特定の拡張子を含むリクエストをログ対象から外す
- CentOS Stream9でApache、PHPを設定する際の注意点
- ApacheのTraceメソッドを無効にする
- ヘッダーにApacheバージョンが表示されないようにする
- PHPのバージョン情報とApacheの設定
- Apacheでディレクトリ内一覧表示を無効にする
- Apacheで不要なモジュールはロードしない
- Apacheで不要なモジュールはロードしない(1)ベーシック認証と認証プロバイダ
- Apacheで不要なモジュールはロードしない(2)ダイジェスト認証
- Apacheで不要なモジュールはロードしない(3)mod_rewrite、LDAP、WebDAV
- Apacheで不要なモジュールはロードしない(4)Server Side Includes
- Apacheで不要なモジュールはロードしない(5)mod_mime_magic
- Apacheで不要なモジュールはロードしない(6)mod_info、mod_status
- Apacheで不要なモジュールはロードしない(7)mod_speling、mod_userdir
- Apacheで不要なモジュールはロードしない(8)プロキシ関連のモジュール
- Apacheで不要なモジュールはロードしない(9)キャッシュ関連のモジュール
- Apacheで不要なモジュールはロードしない(10)CGI関連のモジュール
- Apacheで不要なモジュールはロードしない(11)フィルター、expires、圧縮のモジュール
- Apacheでディレクトリへのアクセスを制限する設定方法
- Apacheベーシック認証の設定手順とセキュリティ上の注意
- Apacheで使用できるHTTPメソッドを制限する
- FIPS140-2とApacheのmod_nss
- Apacheにおける自己証明書作成手順
- ApacheにおけるSSL証明書インストール手順
- DoS攻撃からWebサーバーを保護するApacheモジュール
- Apacheに関するLinux側のセキュリティ設定(パーミッション、iptables、chroot)
- Modsecurityの概要と特徴
- Modsecurityのインストール方法
- modsecurityの設定方法と設定例
- Apacheのパフォーマンスに影響を与えるOS、ハードウェアの要素、注意点
- ApacheのMPMの概要とチューニング
- ApacheのMaxClientsのチューニングとListenBacklog
- HostnameLookupsを有効にして名前解決を行う場合のApacheパフォーマンスに与える影響
- FollowSymLinks、SymLinksIfOwnerMatchの設定とApacheのパフォーマンス
- AllowOverrideの設定とApacheのパフォーマンス
- コンテントネゴシエーションの設定とApacheのパフォーマンス
- Apacheのプロセス生成とパフォーマンスに与える影響
セキュリティ
パフォーマンス