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/
以上です。