blob: a98d8e0b96840a315a9c27bab6815eb1f1f21652 [file]
<?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: 1933423:1935426 (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="intro.xml.meta">
<parentdocument href="./">Rewrite</parentdocument>
<title>Apache mod_rewrite 入門</title>
<summary>
<p>このドキュメントは <module>mod_rewrite</module>
<a href="../mod/mod_rewrite.html">リファレンスドキュメント</a>を補足するものです。
<module>mod_rewrite</module> の使用に必要な基本概念を説明します。
他のドキュメントではさらに詳しく説明しますが、このドキュメントは
初心者が最初の一歩を踏み出すのに役立つはずです。
</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="introduction"><title>はじめに</title>
<p>Apache モジュール <module>mod_rewrite</module> は、URL 操作を行う方法を
提供する非常に強力で洗練されたモジュールです。これを使用すると、
必要なほぼすべての種類の URL 書き換えを行うことができます。
ただし、やや複雑で、初心者には敷居が高く感じられるかもしれません。
また、書き換えルールを実際に何をしているか理解せずに、魔法の呪文として
扱う傾向もあります。</p>
<p>このドキュメントは、以下の内容が単にコピーされるのではなく、
理解されるための十分な背景を提供することを目指しています。
</p>
<p>多くの一般的な URL 操作タスクは <module>mod_rewrite</module>
フルパワーと複雑さを必要としないことを忘れないでください。シンプルな
タスクについては、<module>mod_alias</module>
<a href="../urlmapping.html">URL からファイルシステムへの
マッピング</a>に関するドキュメントを参照してください。</p>
<p>最後に、先に進む前に、<directive module="core">LogLevel</directive>
ディレクティブを使用して <module>mod_rewrite</module> のログレベルを
trace レベルのいずれかに設定してください。これにより圧倒的な量の情報が
得られますが、<module>mod_rewrite</module> 設定の問題をデバッグするのに
不可欠です。各ルールがどのように処理されるかを正確に教えてくれます。</p>
</section>
<section id="regex"><title>正規表現</title>
<p><module>mod_rewrite</module><a href="http://pcre.org/">Perl 互換
正規表現</a>の語彙を使用します。このドキュメントでは、正規表現の
詳細なリファレンスを提供しようとはしていません。そのためには、
<a href="http://pcre.org/pcre.txt">PCRE man ページ</a>
<a href="http://perldoc.perl.org/perlre.html">Perl 正規表現
man ページ</a>、および
<a href="https://www.oreilly.com/library/view/mastering-regular-expressions/0596528124/">Jeffrey Friedl 著
『詳説 正規表現』</a> (第 3 版は 2006 年のものですが、正規表現の
構文は本質的に変わっておらず、このテーマの決定的なリファレンスです)
を推奨します。</p>
<p>このドキュメントでは、圧倒されることなく始められるように、
十分な正規表現の語彙を提供しようとしています。
<directive module="mod_rewrite">RewriteRule</directive> が魔法の呪文ではなく、
科学的な公式であるようになることを願っています。</p>
<section id="regexvocab"><title>正規表現の語彙</title>
<p>以下は、正規表現と <directive
module="mod_rewrite">RewriteRule</directive> を書くために必要な
最小限の構成要素です。これらは完全な正規表現の語彙を表すものでは
ありませんが、良い出発点であり、基本的な正規表現を読むだけでなく、
自分で書くのにも役立つはずです。</p>
<table>
<tr>
<th>文字</th>
<th>意味</th>
<th></th>
</tr>
<tr>
<td><code>.</code></td>
<td>任意の 1 文字にマッチ</td>
<td><code>c.t</code><code>cat</code><code>cot</code>
<code>cut</code> 等にマッチ</td>
</tr>
<tr>
<td><code>+</code></td>
<td>直前のマッチを 1 回以上繰り返す</td>
<td><code>a+</code><code>a</code><code>aa</code>
<code>aaa</code> 等にマッチ</td>
</tr>
<tr>
<td><code>*</code></td>
<td>直前のマッチを 0 回以上繰り返す</td>
<td><code>a*</code><code>a+</code> がマッチするすべてにマッチするが、
空文字列にもマッチする</td>
</tr>
<tr>
<td><code>?</code></td>
<td>マッチをオプションにする</td>
<td><code>colou?r</code><code>color</code>
<code>colour</code> にマッチ</td>
</tr>
<tr>
<td><code>\</code></td>
<td>次の文字をエスケープ</td>
<td><code>\.</code> は上記で説明した<em>任意の 1 文字</em>ではなく、
<code>.</code> (ドット) にマッチ</td>
</tr>
<tr>
<td><code>^</code></td>
<td>アンカーと呼ばれ、文字列の先頭にマッチ</td>
<td><code>^a</code><code>a</code> で始まる文字列にマッチ</td>
</tr>
<tr>
<td><code>$</code></td>
<td>もう一つのアンカーで、文字列の末尾にマッチ</td>
<td><code>a$</code><code>a</code> で終わる文字列にマッチ</td>
</tr>
<tr>
<td><code>( )</code></td>
<td>複数の文字を 1 つの単位にグループ化し、バックリファレンスで
使用するためのマッチをキャプチャ</td>
<td><code>(ab)+</code><code>ababab</code> にマッチ - つまり、
<code>+</code> がグループに適用される。バックリファレンスの
詳細は<a href="#InternalBackRefs">以下</a>を参照</td>
</tr>
<tr>
<td><code>[ ]</code></td>
<td>文字クラス - いずれかの文字にマッチ</td>
<td><code>c[uoa]t</code><code>cut</code><code>cot</code>
<code>cat</code> にマッチ</td>
</tr>
<tr>
<td><code>[^ ]</code></td>
<td>否定文字クラス - 指定されていない任意の文字にマッチ</td>
<td><code>c[^/]t</code><code>cat</code><code>c=t</code>
マッチするが、<code>c/t</code> にはマッチしない</td></tr>
</table>
<p><module>mod_rewrite</module> では、正規表現の前に <code>!</code> 文字を
使用して否定できます。つまり、式の残りの部分にマッチしない場合にのみ、
文字列がマッチしたとみなされます。</p>
</section>
<section id="InternalBackRefs"><title>正規表現バックリファレンスの利用</title>
<p>ここで覚えておくべき重要なことがあります: <em>Pattern</em> 内または
<em>CondPattern</em> 内で括弧を使用するたびに、内部的にバックリファレンスが
作成され、<code>$N</code> および <code>%N</code> という文字列で使用
できます (以下を参照)。これらは
<directive module="mod_rewrite">RewriteRule</directive>
<em>Substitution</em> パラメータまたは
<directive module="mod_rewrite">RewriteCond</directive>
<em>TestString</em> パラメータの作成に使用できます。</p>
<p><directive module="mod_rewrite">RewriteRule</directive> パターン内の
キャプチャは、(直感に反して) すべての先行する
<directive module="mod_rewrite">RewriteCond</directive> ディレクティブで
利用可能です。これは、<directive module="mod_rewrite">RewriteRule</directive>
式が個々の条件よりも先に評価されるためです。</p>
<p>図 1 は、バックリファレンスが展開のためにどの場所に
転送されるかを示すとともに、RewriteRule と RewriteCond の
マッチングのフローを図示しています。次の章では、これらの
バックリファレンスの使用方法を探りますので、最初は少し
馴染みがないように感じても心配しないでください。
</p>
<p class="figure">
<img src="../images/rewrite_backreferences.png"
alt="RewriteRule と RewriteCond マッチングのフロー" /><br />
<dfn>図 1:</dfn> ルールを通るバックリファレンスのフロー。<br />
この例では、<code>/test/1234</code> へのリクエストは <code>/admin.foo?page=test&amp;id=1234&amp;host=admin.example.com</code> に変換されます。
</p>
</section>
</section>
<section id="rewriterule"><title>RewriteRule の基本</title>
<p><directive module="mod_rewrite">RewriteRule</directive> は、
スペースで区切られた 3 つの引数で構成されます。引数は以下の通りです</p>
<ol>
<li><var>Pattern</var>: ルールの影響を受ける受信 URL;</li>
<li><var>Substitution</var>: マッチするリクエストの送信先;</li>
<li><var>[flags]</var>: 書き換えられたリクエストに影響するオプション。</li>
</ol>
<p><var>Pattern</var><a href="#regex">正規表現</a>です。
最初 (最初の書き換えルールまたは置換が発生するまで) は、受信リクエストの
URL パス (ホスト名の後、クエリ文字列の開始を示す疑問符の前の部分) に対して
マッチされます。ディレクトリ単位のコンテキストでは、ルールが定義された
ディレクトリに対するリクエストの相対パスに対してマッチされます。
置換が発生すると、後続のルールは置換された値に対してマッチされます。
</p>
<p class="figure">
<img src="../images/syntax_rewriterule.png"
alt="RewriteRule ディレクティブの構文" /><br />
<dfn>図 2:</dfn> RewriteRule ディレクティブの構文
</p>
<p><var>Substitution</var> 自体は以下の 3 つのいずれかです:</p>
<dl>
<dt>1. リソースへの完全なファイルシステムパス</dt>
<dd>
<highlight language="config">
RewriteRule "^/games" "/usr/local/games/web/puzzles.html"
</highlight>
<p>これは、<directive module="mod_alias">Alias</directive> ディレクティブと
同様に、リクエストをファイルシステム上の任意の場所にマッピングします。</p>
</dd>
<dt>2. リソースへの Web パス</dt>
<dd>
<highlight language="config">
RewriteRule "^/games$" "/puzzles.html"
</highlight>
<p><directive module="core">DocumentRoot</directive>
<code>/usr/local/apache2/htdocs</code> に設定されている場合、
このディレクティブは <code>http://example.com/games</code> への
リクエストをパス <code>/usr/local/apache2/htdocs/puzzles.html</code>
にマッピングします。</p>
</dd>
<dt>3. 絶対 URL</dt>
<dd>
<highlight language="config">
RewriteRule "^/product/view$" "http://site2.example.com/seeproduct.html" [R]
</highlight>
<p>これは、指定された URL に対する新しいリクエストを行うよう
クライアントに指示します。</p>
</dd>
</dl>
<note type="warning"><strong>1</strong><strong>2</strong> はまったく同じ構文であることに注意してください。違いは、<strong>1</strong> の場合はターゲットパスのトップレベル (つまり <code>/usr/</code>) がファイルシステム上に存在するのに対し、<strong>2</strong> の場合は存在しない (つまり、ファイルシステムのルートレベルディレクトリとして <code>/bar/</code> が存在しない) ことです。</note>
<p><var>Substitution</var> には、<var>Pattern</var> でマッチした
受信 URL パスの部分への<em>バックリファレンス</em>も含めることができます。
以下を考えてみてください:</p>
<highlight language="config">
RewriteRule "^/product/(.*)/view$" "/var/web/productdb/$1"
</highlight>
<p>変数 <code>$1</code> は、<var>Pattern</var> 内の括弧内の
式でマッチしたテキストに置き換えられます。例えば、
<code>http://example.com/product/r14df/view</code> へのリクエストは
パス <code>/var/web/productdb/r14df</code> にマッピングされます。</p>
<p>括弧内の式が複数ある場合、変数 <code>$1</code><code>$2</code>
<code>$3</code> 等の順序で利用できます。</p>
</section>
<section id="flags"><title>書き換えフラグ</title>
<p><directive module="mod_rewrite">RewriteRule</directive> の動作は、
ルールの末尾に 1 つ以上のフラグを適用することで変更できます。例えば、
ルールのマッチング動作は <code>[NC]</code> フラグの適用で
大文字小文字を区別しないようにできます:
</p>
<highlight language="config">
RewriteRule "^puppy.html" "smalldog.html" [NC]
</highlight>
<p>利用可能なフラグ、その意味、および例の詳細については、
<a href="flags.html">書き換えフラグ</a>ドキュメントを参照してください。</p>
</section>
<section id="rewritecond"><title>書き換え条件</title>
<p>1 つ以上の <directive module="mod_rewrite">RewriteCond</directive>
ディレクティブを使用して、後続の
<directive module="mod_rewrite">RewriteRule</directive> の対象となる
リクエストの種類を制限できます。最初の引数はリクエストの特性を
記述する変数、2 番目の引数は変数にマッチする必要がある
<a href="#regex">正規表現</a>、3 番目のオプション引数はマッチの
評価方法を変更するフラグのリストです。</p>
<p class="figure">
<img src="../images/syntax_rewritecond.png"
alt="RewriteCond ディレクティブの構文" /><br />
<dfn>図 3:</dfn> RewriteCond ディレクティブの構文
</p>
<p>例えば、特定の IP 範囲からのすべてのリクエストを別のサーバに
送信するには、以下を使用できます:</p>
<highlight language="config">
RewriteCond "%{REMOTE_ADDR}" "^10\.2\."
RewriteRule "(.*)" "http://intranet.example.com$1"
</highlight>
<p>複数の <directive module="mod_rewrite">RewriteCond</directive>
指定された場合、<directive module="mod_rewrite">RewriteRule</directive>
が適用されるには、すべてがマッチする必要があります。例えば、
クエリ文字列に "hack" という単語を含むリクエストを拒否するが、
"go" という単語を含む cookie がある場合は除外するには、以下を使用
できます:</p>
<highlight language="config">
RewriteCond "%{QUERY_STRING}" "hack"
RewriteCond "%{HTTP_COOKIE}" !go
RewriteRule "." "-" [F]
</highlight>
<p>感嘆符は否定マッチを指定しており、cookie に "go" が含まれていない
場合にのみルールが適用されます。</p>
<p><directive module="mod_rewrite">RewriteCond</directive> 内の正規表現の
マッチは、<directive module="mod_rewrite">RewriteRule</directive>
<var>Substitution</var> で変数 <code>%1</code><code>%2</code> 等を
使用して使用できます。例えば、以下はサイトへのアクセスに使用された
ホスト名に応じて、リクエストを異なるディレクトリに振り分けます:</p>
<highlight language="config">
RewriteCond "%{HTTP_HOST}" "(.*)"
RewriteRule "^/(.*)" "/sites/%1/$1"
</highlight>
<p><code>http://example.com/foo/bar</code> へのリクエストの場合、
<code>%1</code><code>example.com</code> を含み、
<code>$1</code><code>foo/bar</code> を含みます。</p>
</section>
<section id="rewritemap"><title>書き換えマップ</title>
<p><directive module="mod_rewrite">RewriteMap</directive> ディレクティブは、
書き換えを行うための外部関数を呼び出す方法を提供します。これについては
<a href="rewritemap.html">RewriteMap 補足ドキュメント</a>でより詳細に
説明されています。</p>
</section>
<section id="htaccess"><title>.htaccess ファイル</title>
<p>書き換えは通常、メインサーバ設定
(<directive type="section" module="core">Directory</directive>
セクション外) または
<directive type="section" module="core">VirtualHost</directive>
コンテナ内で設定されます。これが書き換えの最も簡単な方法であり、
推奨されます。ただし、追加の複雑さを伴いますが、
<directive type="section" module="core">Directory</directive>
セクションや <a href="../howto/htaccess.html"><code>.htaccess</code>
ファイル</a>内で書き換えを行うことも可能です。このテクニックは
ディレクトリ単位の書き換えと呼ばれます。</p>
<p>サーバ単位の書き換えとの主な違いは、<code>.htaccess</code>
ファイルを含むディレクトリのパスプレフィックスが
<directive module="mod_rewrite">RewriteRule</directive> でのマッチング前に
削除されることです。さらに、リクエストが適切にマッピングされるように
<directive module="mod_rewrite">RewriteBase</directive> を使用する
必要があります。</p>
</section>
</manualpage>