Apache HTTP サーバ バージョン 2.5

このドキュメントは mod_rewrite
リファレンスドキュメントを補足するものです。
mod_rewrite について最も重要な概念の一つ、
すなわち、いつ使用を避けるべきかについて説明します。
mod_rewrite は、他の代替手段が不十分な場合の最後の手段と
考えるべきです。よりシンプルな代替手段がある場合に使用すると、
設定が混乱しやすく、壊れやすく、メンテナンスしにくくなります。
他にどのような代替手段が利用できるかを理解することは、
mod_rewrite を習得するための非常に重要なステップです。
これらの例の多くは、特定のサーバ設定ではそのまま動作しないことに 注意してください。そのため、単にコピー&ペーストするのではなく、 内容を理解することが重要です。
mod_rewrite が適切なツールである最も一般的な状況は、
最善の解決策がサーバ設定ファイルへのアクセスを必要とし、そのアクセスが
ない場合です。一部の設定ディレクティブはサーバ設定ファイルでのみ
使用可能です。そのため、.htaccess ファイルのみを使用できるホスティング
環境にいる場合は、mod_rewrite に頼る必要があるかもしれません。
mod_alias は、ある URL から別の URL へのリダイレクト手段を
提供する Redirect および RedirectMatch ディレクティブを提供します。
この種の、ある URL または URL のクラスを別の場所へのシンプルなリダイレクトは、
RewriteRule ではなく、これらの
ディレクティブを使用して行うべきです。RedirectMatch では
リダイレクト基準に正規表現を含めることができ、RewriteRule を
使用する利点の多くを享受できます。
RewriteRule の一般的な使用法は、URL のクラス全体を
リダイレクトすることです。例えば、/one ディレクトリのすべての
URL を http://one.example.com/ にリダイレクトする必要がある場合や、
すべての http リクエストを https に
リダイレクトする必要がある場合などです。
これらの状況は Redirect ディレクティブで処理する方が
適切です。Redirect はパス情報を保持することを忘れないでください。
つまり、URL /one のリダイレクトは、/one/two.html
や /one/three/four.html など、その配下のすべての URL も
リダイレクトします。
/one 配下の URL を
http://one.example.com にリダイレクトするには、
以下のようにします:
Redirect "/one/" "http://one.example.com/"
あるホスト名から別のホスト名にリダイレクトするには、例えば
example.com を www.example.com にリダイレクトするには、
正規ホスト名
のレシピを参照してください。
http URL を https にリダイレクトするには、
以下のようにします:
<VirtualHost *:80>
ServerName www.example.com
Redirect "/" "https://www.example.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
# ... SSL 設定をここに記述
</VirtualHost>
同じスコープに他の RewriteRule ディレクティブがある場合は、
このタスクに RewriteRule を使用するのが適切な場合があります。
これは、同じスコープに Redirect と RewriteRule
ディレクティブがある場合、設定ファイルでの出現順序に関係なく、
RewriteRule ディレクティブが先に実行されるためです。
http から https へのリダイレクトの場合、メインサーバ設定ファイルに
アクセスできず、.htaccess ファイルでこのタスクを実行する必要がある
場合は、RewriteRule の使用が適切です。
Alias ディレクティブは、
URI からディレクトリ (通常は DocumentRoot
の外部のディレクトリ) へのマッピングを提供します。このマッピングを
mod_rewrite で行うことは可能ですが、シンプルさとパフォーマンスの
理由から Alias が推奨される
方法です。
Alias "/cats" "/var/www/virtualhosts/felines/htdocs"
サーバ設定ファイルにアクセスできない場合に、このマッピングを行うために
mod_rewrite を使用するのが適切な場合があります。Alias は
サーバまたはバーチャルホストのコンテキストでのみ使用でき、
.htaccess ファイルでは使用できません。
サーバで Options FollowSymLinks が有効になっている場合は、
シンボリックリンクも同じことを実現する方法の一つです。
mod_rewrite でバーチャルホストを
処理することは可能ですが、適切な方法であることはめったにありません。
個別の <VirtualHost>
ブロックを作成するのがほぼ常に正しい方法です。非常に多数のバーチャルホストが
ある場合は、mod_vhost_alias を使用してこれらのホストを
自動的に作成することを検討してください。
mod_macro などのモジュールも、
多数のバーチャルホストを動的に作成するのに便利です。
ホスティングサービスがサーバ設定ファイルへのアクセスを提供せず、
.htaccess ファイルを使用した設定に制限されている場合は、
バーチャルホスト作成に mod_rewrite を使用するのが
適切な場合があります。
それでも適切なアプローチと思われる場合に、これをどのように実現 するかの詳細については、mod_rewrite による バーチャルホストドキュメントを参照してください。
RewriteRule は、書き換えた URI を
mod_proxy 経由で渡すための [P]
フラグを提供します。
RewriteRule "^/?images(.*)" "http://imageserver.local/images$1" [P]
ただし、上の例のように実際のパターンマッチングが不要な場合は、
ProxyPass ディレクティブの方が
適切な選択です。上の例は以下のように記述できます:
ProxyPass "/images/" "http://imageserver.local/images/"
RewriteRule と ProxyPass のどちらを使用する場合でも、
バックエンドサーバから発行されるリダイレクトをキャッチするために
ProxyPassReverse ディレクティブを
使用する必要があることに注意してください:
ProxyPassReverse "/images/" "http://imageserver.local/images/"
同じスコープで他の RewriteRule が有効な場合は、
RewriteRule は通常 ProxyPass よりも先に適用されるため、
実現しようとしていることを横取りする可能性があり、代わりに
RewriteRule を使用する必要がある場合があります。
mod_rewrite は、特定の環境変数やリクエストヘッダの
有無に基づいて特定のアクションを実行するために頻繁に使用されます。
これは <If>
ディレクティブを使用してより効率的に行えます。
例えば、正規ホスト名を強制するために RewriteRule
を使用する一般的なシナリオ、つまり example.com の代わりに
www.example.com を使用させるシナリオを考えてみましょう。
これは、次に示すように <If>
ディレクティブを使用して行えます:
<If "req('Host') != 'www.example.com'">
Redirect "/" "http://www.example.com/"
</If>
このテクニックは、任意のリクエストヘッダ、レスポンスヘッダ、または
環境変数に基づいてアクションを実行するために使用でき、多くの一般的な
シナリオで mod_rewrite を置き換えることができます。
特に <If> セクションや
その他の特定のディレクティブで使用できる式の種類の概要については、
式の評価ドキュメントを参照してください。