RewriteBase相対書き換えルールのターゲットにのみ適用されます。
このようにRewriteBaseを使用しています...
RewriteBase /folder/
RewriteRule a\.html b.html
本質的に同じです...
RewriteRule a\.html /folder/b.html
しかし、.htaccessファイルが中にある/folder/場合、これも同じターゲットを指します。
RewriteRule a\.html b.html
ドキュメントは常にを使用することを示唆していますがRewriteBase、Apacheは通常、次の場合を除いて、DocumentRootの下のパスに対して正しく検出します。
このような場合は、RewriteBaseを指定する必要がある場合があります。
ただし、混乱を招くディレクティブであるため、一般的に書き換えターゲットで絶対(別名「ルート相対」)URIを指定する方が良いでしょう。ルールを読んでいる他の開発者は、これらをより簡単に把握できます。
ここでジョン・リンの優れた詳細な回答から引用します:
htaccessファイルでは、mod_rewriteは<Directory>または<Location>コンテナーと同様に機能します。とはRewriteBase、相対パスのベースを提供するために使用されます。
たとえば、次のフォルダ構造があるとします。
DocumentRoot
|-- subdir1
`-- subdir2
`-- subsubdir
だからあなたはアクセスすることができます:
http://example.com/ (ルート)
http://example.com/subdir1 (subdir1)
http://example.com/subdir2 (subdir2)
http://example.com/subdir2/subsubdir (サブサブディレクトリ)
を介して送信されるURI RewriteRuleは、htaccessファイルを含むディレクトリを基準にしています。だからあなたが持っている場合:
RewriteRule ^(.*)$ -
- ルートhtaccessで、リクエストがの
/a/b/c/d場合、キャプチャされたURI($1)はa/b/c/dです。
- ルールが
subdir2あり、リクエストが/subdir2/e/f/gその場合、キャプチャされたURIはe/f/gです。
- ルールがに
subsubdirあり、リクエストが/subdir2/subsubdir/x/y/zである場合、キャプチャされたURIはx/y/zです。
ルールが存在するディレクトリには、URIから削除された部分があります。書き換えベースはこれに影響を与えません。これは、単にディレクトリごとに機能する方法です。
書き換えベースが行うことは、ルールのtarget内の相対パスに(ファイルパスベースではなく) URLパスベースを提供することです。したがって、次のルールがあるとします。
RewriteRule ^foo$ bar.php [L]
bar.phpとは対照的に、相対パスです。
RewriteRule ^foo$ /bar.php [L]
ここで、/bar.phpは絶対パスです。絶対パスは常に(上記のディレクトリ構造の)「ルート」になります。つまり、ルールが「ルート」、「subdir1」、「subsubdir」などにあるかどうかに関係なく、/bar.phpパスは常にマップされますhttp://example.com/bar.phpます。
ただし、相対パスを使用する他のルールは、ルールが存在するディレクトリに基づいています。したがって、
RewriteRule ^foo$ bar.php [L]
は「ルート」にあり、あなたはに行きhttp://example.com/foo、あなたはサービスを受けhttp://example.com/bar.phpます。しかし、そのルールが「subdir1」ディレクトリにあり、に移動するとhttp://example.com/subdir1/foo、サービスが提供されhttp://example.com/subdir1/bar.phpます。ドキュメントが言うように、これは時々機能し、時々機能しないこともありますが、相対パスに必要であるはずですが、ほとんどの場合それは機能するようです。(Rフラグを使用して、またはhttp://hostルールのターゲットにあるために暗黙的に)リダイレクトする場合を除きます。それはこのルールを意味します:
RewriteRule ^foo$ bar.php [L,R]
「subdir2」ディレクトリにある場合、に移動するとhttp://example.com/subdir2/foo、mod_rewriteは相対パスをURLパスではなくファイルパスと間違え、Rフラグが原因で、次のようなものにリダイレクトされることになりますhttp://example.com/var/www/localhost/htdocs/subdir1。それは明らかにあなたが望むものではありません。
これがRewriteBase出てきます。ディレクティブは、すべての相対パスの先頭に何を追加するかをmod_rewriteに伝えます。だから私が持っている場合:
RewriteBase /blah/
RewriteRule ^foo$ bar.php [L]
「subsubdir」では、http://example.com/subdir2/subsubdir/foo実際に私にサービスを提供しますhttp://example.com/blah/bar.php。ベースの最後に「bar.php」が追加されます。実際には、同じディレクトリコンテナまたはhtaccessファイルに複数のベースを含めることはできないため、この例は通常は望ましくありません。
ほとんどの場合、これは次のように使用されます。
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
これらのルールは "subdir1"ディレクトリにあり、
RewriteBase /subdir2/subsubdir/
RewriteRule ^foo$ bar.php [L]
「subsubdir」ディレクトリにあります。
これにより、部分的にルールを移植可能にすることができるので、ルールを任意のディレクトリにドロップでき、一連のルールではなくベースを変更するだけで済みます。たとえば、次の場合:
RewriteEngine On
RewriteRule ^foo$ /subdir1/bar.php [L]
RewriteRule ^blah1$ /subdir1/blah.php?id=1 [L]
RewriteRule ^blah2$ /subdir1/blah2.php [L]
...
などのhttp://example.com/subdir1/fooサービスが提供されるようにしhttp://example.com/subdir1/bar.phpます。そして、それらすべてのファイルとルールを「subsubdir」ディレクトリに移動することにしたとしましょう。/subdir1/toのすべてのインスタンスを変更する代わりに、/subdir2/subsubdir/単にベースを持っている可能性があります:
RewriteEngine On
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
RewriteRule ^blah1$ blah.php?id=1 [L]
RewriteRule ^blah2$ blah2.php [L]
...
そして、これらのファイルとルールを別のディレクトリに移動する必要がある場合は、ベースを変更するだけです。
RewriteBase /subdir2/subsubdir/
以上です。