| <?xml version="1.0" encoding="UTF-8" ?> |
| <!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd"> |
| <?xml-stylesheet type="text/xsl" href="../style/manual.ja.xsl"?> |
| <!-- English Revision: 1933438:1935430 (outdated) --> |
| |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <manualpage metafile="tech.xml.meta"> |
| <parentdocument href="./">Rewrite</parentdocument> |
| |
| <title>Apache mod_rewrite 技術的詳細</title> |
| |
| <summary> |
| <p>このドキュメントでは、<module>mod_rewrite</module> と URL マッチングの |
| 技術的な詳細について説明します。</p> |
| </summary> |
| <seealso><a href="../mod/mod_rewrite.html">モジュールドキュメント</a></seealso> |
| <seealso><a href="intro.html">mod_rewrite 入門</a></seealso> |
| <seealso><a href="remapping.html">リダイレクトとリマッピング</a></seealso> |
| <seealso><a href="access.html">アクセス制御</a></seealso> |
| <seealso><a href="vhosts.html">バーチャルホスト</a></seealso> |
| <seealso><a href="proxy.html">プロキシ</a></seealso> |
| <seealso><a href="rewritemap.html">RewriteMap の使用</a></seealso> |
| <seealso><a href="advanced.html">高度なテクニック</a></seealso> |
| <seealso><a href="avoid.html">mod_rewrite を使わない場合</a></seealso> |
| |
| <section id="InternalAPI"><title>API フェーズ</title> |
| |
| <p>Apache HTTP Server は、いくつかのフェーズでリクエストを処理します。 |
| 各フェーズでは、リクエストライフサイクルのその部分を処理するために |
| 1 つ以上のモジュールが呼び出される可能性があります。フェーズには、 |
| URL からファイル名への変換、認証、認可、コンテンツ、ロギングなどが |
| 含まれます。(これは完全なリストではありません。)</p> |
| |
| <p><module>mod_rewrite</module> は、URL の書き換え方法に影響を与えるために、 |
| これらのフェーズ (しばしば「フック」と呼ばれます) のうち 2 つで |
| 動作します。</p> |
| |
| <p>まず、URL からファイル名への変換フックを使用します。これは |
| HTTP リクエストが読み取られた後、認可が開始される前に発生します。 |
| 次に、Fixup フックを使用します。これは認可フェーズの後、 |
| ディレクトリ単位の設定ファイル (<code>.htaccess</code> ファイル) |
| が読み取られた後、コンテンツハンドラが呼び出される前です。</p> |
| |
| <p>リクエストが到着し、対応するサーバまたはバーチャルホストが |
| 決定された後、書き換えエンジンはサーバ単位の設定に含まれる |
| <module>mod_rewrite</module> ディレクティブの処理を開始します。 |
| (つまり、メインサーバ設定ファイルと |
| <directive module="core" type="section">Virtualhost</directive> |
| セクション内のディレクティブです。) これは URL からファイル名への |
| 変換フェーズで発生します。</p> |
| |
| <p>数ステップ後、最終的なデータディレクトリが見つかると、 |
| ディレクトリ単位の設定ディレクティブ (<code>.htaccess</code> |
| ファイルと <directive module="core" |
| type="section">Directory</directive> ブロック) が適用されます。 |
| これは Fixup フェーズで発生します。</p> |
| |
| <p>これらの各ケースで、<module>mod_rewrite</module> は |
| <code>REQUEST_URI</code> を新しい URL またはファイル名に |
| 書き換えます。</p> |
| |
| <p>ディレクトリ単位のコンテキスト (つまり <code>.htaccess</code> |
| ファイルと <code>Directory</code> ブロック内) では、URL が既に |
| ファイル名に変換された後にこれらのルールが適用されます。このため、 |
| <module>mod_rewrite</module> が最初に <directive |
| module="mod_rewrite">RewriteRule</directive> ディレクティブと比較する |
| URL パスは、変換されたファイル名のフルファイルシステムパスから、 |
| 現在のディレクトリのパス (末尾のスラッシュを含む) を先頭から |
| 削除したものになります。</p> |
| |
| <p>例として: ルールが /var/www/foo/.htaccess にあり、 |
| /foo/bar/baz へのリクエストが処理されている場合、^bar/baz$ のような |
| 式がマッチします。</p> |
| |
| <p>ディレクトリ単位のコンテキストで置換が行われた場合、新しい URL で |
| 新しい内部サブリクエストが発行され、リクエストフェーズの処理が |
| 再開されます。置換が相対パスの場合、<directive |
| module="mod_rewrite">RewriteBase</directive> ディレクティブが |
| 置換の前に付加する URL パスプレフィックスを決定します。 |
| ディレクトリ単位のコンテキストでは、ループを避けるために、 |
| 最終的に (将来のディレクトリ単位の書き換え処理の「ラウンド」で) |
| 置換を行わないルールを作成するよう注意する必要があります。 |
| (この問題の詳細については |
| <a href="https://cwiki.apache.org/confluence/display/httpd/RewriteLooping">RewriteLooping</a> |
| を参照してください。)</p> |
| |
| <p>ディレクトリ単位のコンテキストでの URL のさらなる操作のため、 |
| そのコンテキストでは書き換えルールを異なるように作成するよう |
| 注意する必要があります。特に、先頭のディレクトリパスが書き換えルールが |
| 認識する URL から削除されることを忘れないでください。詳細については |
| 以下の例を参照してください。</p> |
| |
| <table border="1"> |
| |
| <tr> |
| <th>ルールの場所</th> |
| <th>ルール</th> |
| </tr> |
| |
| <tr> |
| <td>VirtualHost セクション</td> |
| <td>RewriteRule "^/images/(.+)\.jpg" "/images/$1.gif"</td> |
| </tr> |
| |
| <tr> |
| <td>ドキュメントルートの .htaccess ファイル</td> |
| <td>RewriteRule "^images/(.+)\.jpg" "images/$1.gif"</td> |
| </tr> |
| |
| <tr> |
| <td>images ディレクトリの .htaccess ファイル</td> |
| <td>RewriteRule "^(.+)\.jpg" "$1.gif"</td> |
| </tr> |
| |
| </table> |
| |
| <p><module>mod_rewrite</module> がさまざまなコンテキストで URL をどのように |
| 操作するかについてさらに詳しくは、書き換え中に作成される |
| <a href="../mod/mod_rewrite.html#logging">ログエントリ</a>を |
| 参照してください。</p> |
| |
| </section> |
| |
| <section id="InternalRuleset"><title>ルールセットの処理</title> |
| |
| <p>これら 2 つの API フェーズで <module>mod_rewrite</module> がトリガー |
| されると、設定構造体 (サーバ単位のコンテキストではスタートアップ時に |
| 作成されたもの、ディレクトリ単位のコンテキストでは Apache カーネルの |
| ディレクトリウォーク中に作成されたもの) から設定済みのルールセットを |
| 読み取ります。次に、含まれるルールセット (1 つ以上のルールとその |
| 条件のセット) を使用して URL 書き換えエンジンが起動されます。 |
| URL 書き換えエンジン自体の動作は、両方の設定コンテキストで |
| まったく同じです。最終結果の処理のみが異なります。</p> |
| |
| <p>ルールセット内のルールの順序は重要です。書き換えエンジンは |
| 特殊な (あまり直感的ではない) 順序でルールを処理するためです。 |
| ルールは次のとおりです: 書き換えエンジンはルールセットをルールごとに |
| (<directive module="mod_rewrite">RewriteRule</directive> |
| ディレクティブ) ループし、特定のルールがマッチすると、対応する |
| 条件 (<code>RewriteCond</code> ディレクティブ) をオプションで |
| ループします。歴史的な理由により、条件が先に記述されるため、 |
| 制御フローは少し冗長になります。詳細は図 1 を参照してください。</p> |
| <p class="figure"> |
| <img src="../images/rewrite_process_uri.png" |
| alt="RewriteRule と RewriteCond マッチングのフロー" /><br /> |
| <dfn>図 1:</dfn> 書き換えルールセットを通る制御フロー |
| </p> |
| <p>まず、URL が各ルールの <em>Pattern</em> に対してマッチされます。 |
| マッチしない場合、<module>mod_rewrite</module> はそのルールの処理を |
| 直ちに停止し、次のルールに進みます。<em>Pattern</em> がマッチすると、 |
| <module>mod_rewrite</module> は対応するルール条件 (設定内の RewriteRule の |
| 直前に記述される RewriteCond ディレクティブ) を探します。 |
| 条件がない場合、URL を <em>Substitution</em> 文字列から構築された |
| 新しい値で置換し、ルールループを続行します。条件が存在する場合、 |
| 記述された順序で処理する内部ループを開始します。条件のロジックは |
| 異なります: 現在の URL に対してパターンをマッチさせるのではなく、 |
| まず変数の展開、バックリファレンス、マップ検索<em>等</em>を行って |
| <em>TestString</em> 文字列を作成し、それに対して |
| <em>CondPattern</em> をマッチさせようとします。パターンがマッチしない |
| 場合、条件のセット全体と対応するルールが失敗します。パターンが |
| マッチすると、次の条件が処理され、条件がなくなるまで続きます。 |
| すべての条件がマッチした場合、URL の <em>Substitution</em> による |
| 置換の処理が続行されます。</p> |
| |
| </section> |
| |
| |
| </manualpage> |