Apache HTTP サーバ バージョン 2.5

このドキュメントは mod_rewrite
リファレンスドキュメントを補足するものです。
mod_rewrite を使用したいくつかの高度なテクニックを提供します。
URL ベースの複数バックエンドへのシャーディング
オンザフライのコンテンツ再生成
ロードバランシング
構造化ユーザディレクトリ
アンカーのリダイレクト
時間に依存する書き換え
URL の部分に基づく環境変数の設定サーバ負荷やストレージスペースの負担を分散するための 一般的なテクニックは「シャーディング」と呼ばれます。 この方法を使用すると、フロントエンドサーバは URL を使用して ユーザやオブジェクトを別々のバックエンドサーバに一貫して 「シャード」します。
ユーザからターゲットサーバへのマッピングが外部マップファイルに 保持されています。次のような形式です:
user1 physical_host_of_user1
user2 physical_host_of_user2
# ... 以下同様
これを map.users-to-hosts ファイルに入れます。目的は
以下をマッピングすることです:
/u/user1/anypath
を以下にマッピング:
http://physical_host_of_user1/u/user/anypath
このようにすると、すべての URL パスがすべてのバックエンド物理 ホストで有効である必要はありません。以下のルールセットは、 マップファイルの助けを借りてこれを実現します。server0 は、 ユーザがマップにエントリを持たない場合に使用されるデフォルト サーバとして想定しています:
RewriteEngine on
RewriteMap users-to-hosts "txt:/path/to/map.users-to-hosts"
RewriteRule "^/u/([^/]+)/?(.*)" "http://${users-to-hosts:$1|server0}/u/$1/$2"
このディレクティブの構文の詳細については、
RewriteMap
ドキュメントと RewriteMap ハウツー
を参照してください。
コンテンツを動的に生成したいが、一度生成したら静的に 保存したいとします。このルールは静的ファイルの存在を確認し、 存在しない場合は生成します。静的ファイルは必要に応じて (例えば cron で) 定期的に削除でき、要求に応じて再生成 されます。
# This example is valid in per-directory context only
RewriteCond "%{REQUEST_URI}" !-U
RewriteRule "^(.+)\.html$" "/regenerate_page.cgi" [PT,L]
-U 演算子は、テスト文字列 (この場合は
REQUEST_URI) が有効な URL かどうかを判定します。
これはサブリクエストを通じて行われます。このサブリクエストが
失敗した場合、つまりリクエストされたリソースが存在しない場合、
このルールは CGI プログラム /regenerate_page.cgi
を呼び出し、リクエストされたリソースを生成してドキュメント
ディレクトリに保存します。これにより、次回リクエストされたときに
静的コピーを提供できます。
このようにして、更新頻度の低いドキュメントを静的形式で 提供できます。ドキュメントを更新する必要がある場合は、 ドキュメントディレクトリから削除すれば、次回リクエストされたときに 再生成されます。
mod_rewrite を使用して、複数のサーバに
ランダムに負荷を分散したいとします。
これを実現するために RewriteMap とサーバの
リストを使用します。
RewriteEngine on
RewriteMap lb "rnd:/path/to/serverlist.txt"
RewriteRule "^/(.*)" "http://${lb:servers}/$1" [P,L]
serverlist.txt にはサーバのリストが含まれます:
## serverlist.txt
servers one.example.com|two.example.com|three.example.com
特定のサーバにより多くの負荷を割り当てたい場合は、 リストにそのサーバを複数回追加してください。
Apache にはロードバランシングモジュール -
mod_proxy_balancer - が付属しており、
mod_rewrite で構築できるものよりもはるかに柔軟で
機能豊富です。
数千人のユーザを持つサイトの中には、構造化されたホームディレクトリ
レイアウトを使用するものがあります。つまり、各ホームディレクトリは
ユーザ名の最初の文字で始まるサブディレクトリにあります。例えば、
/~larry/anypath は
/home/l/larry/public_html/anypath
であり、/~waldo/anypath は
/home/w/waldo/public_html/anypath
です。
上記のレイアウトにチルダ URL を展開するために、以下のルールセットを 使用します。
RewriteEngine on RewriteRule "^/~(([a-z])[a-z0-9]+)(.*)" "/home/$2/$1/public_html$3"
デフォルトでは、HTML アンカーへのリダイレクトは機能しません。
mod_rewrite が # 文字をエスケープして
%23 に変換するためです。これによりリダイレクトが
壊れます。
RewriteRule で [NE] フラグを
使用します。NE は No Escape (エスケープしない) の略です。
mod_rewrite がデフォルトで
URL エンコードする他の特殊文字にも適用できます。mod_rewrite を使用して、時間帯に基づいて
異なるコンテンツを提供したいとします。
書き換え条件に使用できる TIME_xxx という名前の
変数が多数あります。特殊な辞書順比較パターン
<STRING、>STRING、
=STRING と組み合わせることで、時間に依存する
リダイレクトを行えます:
RewriteEngine on
RewriteCond "%{TIME_HOUR}%{TIME_MIN}" >0700
RewriteCond "%{TIME_HOUR}%{TIME_MIN}" <1900
RewriteRule "^foo\.html$" "foo.day.html" [L]
RewriteRule "^foo\.html$" "foo.night.html"
これにより、URL foo.html で
07:01-18:59 の間は foo.day.html の
コンテンツを、残りの時間帯は foo.night.html の
コンテンツを提供します。
mod_cache、中間プロキシ、
およびブラウザはそれぞれレスポンスをキャッシュし、設定された
時間枠外にいずれかのページが表示される可能性があります。
mod_expires を使用してこの影響を制御できます。
もちろん、コンテンツを動的に提供し、時間帯に基づいて
カスタマイズする方がはるかに良いでしょう。書き換えを実行する際に何らかの状態を維持したい場合が あります。例えば、書き換えを行ったことをメモし、後でリクエストが その書き換えを経由したかどうかを確認したいとします。これを行う 1 つの方法は、環境変数を設定することです。
[E] フラグを使用して環境変数を設定します。
RewriteEngine on RewriteRule "^/horse/(.*)" "/pony/$1" [E=rewritten:1]
後のルールセットで RewriteCond を使用してこの環境変数を 確認できます:
RewriteCond "%{ENV:rewritten}" =1
環境変数は外部リダイレクトでは保持されないことに注意 してください。[CO] フラグを使用して cookie を設定することを 検討するとよいでしょう。ディレクトリ単位および htaccess の 書き換えでは、最終的な置換が内部リダイレクトとして処理されるため、 前回の書き換えラウンドの環境変数には "REDIRECT_" がプレフィックスとして 付きます。