<-
Apache > HTTP サーバ > ドキュメンテーション > バージョン 2.5 > Rewrite

mod_rewrite の高度なテクニック

翻訳済み言語:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn 

このドキュメントは mod_rewrite リファレンスドキュメントを補足するものです。 mod_rewrite を使用したいくつかの高度なテクニックを提供します。

これらの例の多くは、特定のサーバ設定ではそのまま 動作しないことに注意してください。そのため、単にコピー&ペーストするのではなく、 内容を理解することが重要です。

参照

top

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 ハウツー を参照してください。

top

オンザフライのコンテンツ再生成

説明:

コンテンツを動的に生成したいが、一度生成したら静的に 保存したいとします。このルールは静的ファイルの存在を確認し、 存在しない場合は生成します。静的ファイルは必要に応じて (例えば 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 を呼び出し、リクエストされたリソースを生成してドキュメント ディレクトリに保存します。これにより、次回リクエストされたときに 静的コピーを提供できます。

このようにして、更新頻度の低いドキュメントを静的形式で 提供できます。ドキュメントを更新する必要がある場合は、 ドキュメントディレクトリから削除すれば、次回リクエストされたときに 再生成されます。

top

ロードバランシング

説明:

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 で構築できるものよりもはるかに柔軟で 機能豊富です。

top

構造化ユーザディレクトリ

説明:

数千人のユーザを持つサイトの中には、構造化されたホームディレクトリ レイアウトを使用するものがあります。つまり、各ホームディレクトリは ユーザ名の最初の文字で始まるサブディレクトリにあります。例えば、 /~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"
top

アンカーのリダイレクト

説明:

デフォルトでは、HTML アンカーへのリダイレクトは機能しません。 mod_rewrite# 文字をエスケープして %23 に変換するためです。これによりリダイレクトが 壊れます。

解決方法:

RewriteRule[NE] フラグを 使用します。NE は No Escape (エスケープしない) の略です。

議論:
このテクニックは、mod_rewrite がデフォルトで URL エンコードする他の特殊文字にも適用できます。
top

時間に依存する書き換え

説明:

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.html07:01-18:59 の間は foo.day.html の コンテンツを、残りの時間帯は foo.night.html の コンテンツを提供します。

mod_cache、中間プロキシ、 およびブラウザはそれぞれレスポンスをキャッシュし、設定された 時間枠外にいずれかのページが表示される可能性があります。 mod_expires を使用してこの影響を制御できます。 もちろん、コンテンツを動的に提供し、時間帯に基づいて カスタマイズする方がはるかに良いでしょう。
top

URL の部分に基づく環境変数の設定

説明:

書き換えを実行する際に何らかの状態を維持したい場合が あります。例えば、書き換えを行ったことをメモし、後でリクエストが その書き換えを経由したかどうかを確認したいとします。これを行う 1 つの方法は、環境変数を設定することです。

解決方法:

[E] フラグを使用して環境変数を設定します。

RewriteEngine on
RewriteRule   "^/horse/(.*)"   "/pony/$1" [E=rewritten:1]

後のルールセットで RewriteCond を使用してこの環境変数を 確認できます:

RewriteCond "%{ENV:rewritten}"  =1

環境変数は外部リダイレクトでは保持されないことに注意 してください。[CO] フラグを使用して cookie を設定することを 検討するとよいでしょう。ディレクトリ単位および htaccess の 書き換えでは、最終的な置換が内部リダイレクトとして処理されるため、 前回の書き換えラウンドの環境変数には "REDIRECT_" がプレフィックスとして 付きます。

翻訳済み言語:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn