mod_rewriteの内容を理解するには、まずWebサーバーの動作を理解する必要があります。WebサーバーはHTTPリクエストに応答します。最も基本的なレベルのHTTPリクエストは次のようになります。
GET /foo/bar.html HTTP/1.1
これは、ブラウザからURL /foo/bar.html
を要求するWebサーバーへの単純な要求です。ファイルを要求するのではなく、任意のURLを要求するだけであることを強調することが重要です。リクエストは次のようになります。
GET /foo/bar?baz=42 HTTP/1.1
これはURLのリクエストと同様に有効であり、ファイルとは明らかに関係ありません。
Webサーバーは、ポートをリッスンするアプリケーションであり、そのポートで着信するHTTPリクエストを受け入れ、応答を返します。Webサーバーは、要求に適切に対応する方法で、または応答するように構成した方法で、完全に自由に応答できます。この応答はファイルではなく、HTTP応答であり、任意のディスク上の物理ファイルとは関係ない場合があります。WebサーバーはApacheである必要はありません。永続的に実行され、HTTP要求に応答するポートに接続されている単なるプログラムである他の多くのWebサーバーがあります。自分で書くことができます。この段落は、URLがファイルと直接等しいという概念から離れることを目的としており、理解することが非常に重要です。:)
ほとんどのWebサーバーのデフォルト構成では、ハードディスク上のURLと一致するファイルを探します。たとえば、サーバーのドキュメントルートがに設定されて/var/www
いる場合、ファイル/var/www/foo/bar.html
が存在するかどうかを調べ、存在する場合はそれを提供します。「.phpの」内のファイルが終了した場合には、PHPインタプリタを起動します、その後、結果を返します。この関連付けはすべて完全に構成可能です。WebサーバーがPHPインタープリターを介してファイルを実行するために、ファイルの末尾が「.php」である必要はありません。URLは、何かが発生するためにディスク上の特定のファイルと一致する必要はありません。
mod_rewriteは、内部リクエスト処理を書き換える方法です。WebサーバーがURLのリクエストを受信した場合、Webサーバーが一致するディスク上のファイルを検索する前に、そのURLを別のURLに書き換えること/foo/bar
ができます。簡単な例:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
このルールは、リクエストが「/ foo / bar」に一致するたびに、それを「/ foo / baz」に書き換えます。リクエストは、/foo/baz
代わりにリクエストされたかのように処理されます。これは、たとえば次のようなさまざまな効果に使用できます。
RewriteRule (.*) $1.html
このルールは、あらゆるものに一致し()、それ.*
をキャプチャーし((..)
)、 "。html"を追加するように書き換えます。つまり、/foo/bar
リクエストされたURLであった場合、リクエストされた場合と同様に処理/foo/bar.html
されます。正規表現のマッチング、キャプチャ、および置換の詳細については、http://regular-expressions.infoを参照してください。
別のよくあるルールはこれです:
RewriteRule (.*) index.php?url=$1
これも、すべてに一致し、最初に要求されたURLがurl
クエリパラメータに追加されたファイルindex.phpに書き換えます。つまり、入ってくるすべてのリクエストに対して、ファイルindex.phpが実行され、このファイルはの元のリクエストにアクセス$_GET['url']
できるので、必要なことを何でも実行できます。
主に、これらの書き換えルールをWebサーバー構成ファイルに入れます。Apacheを使用すると.htaccess
、ドキュメントルート内(つまり、.phpファイルの横)で呼び出されるファイルにそれらを配置することもできます* 。
* プライマリApache構成ファイルで許可されている場合。これはオプションですが、多くの場合有効になっています。
mod_rewriteが行わないこと
mod_rewriteは、すべてのURLを魔法のように「きれい」にするわけではありません。これはよくある誤解です。Webサイトにこのリンクがある場合:
<a href="https://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
mod_rewriteがそれをきれいにするためにできることは何もありません。これをきれいなリンクにするには、次のことを行う必要があります。
リンクをきれいなリンクに変更します。
<a href="https://stackoverflow.com/my/pretty/link">
サーバーでmod_rewriteを使用して、/my/pretty/link
上記のいずれかの方法でURLへのリクエストを処理します。
(mod_substitute
一緒にを使用して、発信HTMLページとそこに含まれるリンクを変換できます。ただし、これは通常、HTMLリソースを更新するだけではありません。)
mod_rewriteでできることはたくさんあり、非常に複雑なマッチングルールを作成できます。これには、いくつかの書き換えのチェーン、完全に異なるサービスまたはマシンへのリクエストのプロキシ、特定のHTTPステータスコードをレスポンスとして返す、リクエストのリダイレクトなどが含まれます。非常に強力で、基本的なHTTP要求/応答メカニズムを理解している場合は非常に便利です。リンクが自動的にきれいになるわけではありません。
可能なすべてのフラグとオプションについては、公式ドキュメントを参照してください。