RewriteBaseは.htaccessでどのように機能しますか


227

私はこれをいくつか見ました .htaccess

RewriteBase /

機能的には、 <base href="">はHTMLです。

私はそれが自動的にその価値を最初に付加するかもしれないと信じています RewriteRuleステートメント(おそらくスラッシュのないもの)。

私はそれを適切に機能させることができませんでした。私はしばしば本番とは異なる開発サーバーを持っているので、サイトの移植性のために非常に便利になると思います。現在の方法では、自分の一部を削除しますRewriteRuleステートメントます。

誰でも簡単にそれを実装する方法を説明できますか?

ありがとう



RewriteBaseは、ディレクトリまたは.htaccessコンテキストでのみ機能します。提供されているリンク@SalmanPKのコンテキストを参照してください。
Eddie B

1
適切な説明については、この回答を参照してください。stackoverflow.com/a/2137593/292060
goodeye 2013年

1
これはより詳細な回答です:stackoverflow.com/a/21348047/632951
Pacerier '28

これは、1行の答えは:stackoverflow.com/a/46541685/632951
Pacerier

回答:


102

私自身の言葉では、ドキュメントを読んで実験した後:

を使用RewriteBaseして、書き換えのベースを提供できます。このことを考慮

# invoke rewrite engine
    RewriteEngine On
    RewriteBase /~new/

# add trailing slash if missing
    rewriteRule ^(([a-z0-9\-]+/)*[a-z0-9\-]+)$ $1/ [NC,R=301,L]

これは、URLの末尾にスラッシュがあることを確認するために使用した実際のルールです。これは変換されます

http://www.example.com/~new/page

http://www.example.com/~new/page/

持つことでRewriteBaseあり、あなたは相対パスを作る外れRewriteBaseパラメータを。


10
「RewriteBaseパラメータを解除してください」-rewriteRuleパラメータを意味しましたか?:)
キサキ

1
htaccessの詳細をいくつかクリアしたいのですが、ReWriteBaseは、htaccessのすべてのルールに対して、その宣言に従って設定しますか?設定を解除する方法はありますか、リセットできますか?
デイモン

3
@Kissaki:いいえ、は$1括弧で囲まれたRewriteRuleパターンと一致しますが、置換の相対パスはRewriteBaseパラメータから取得されます。したがって、結果の置換は/~new/$1/です。
MrWhite 2013

3
@Damon:複数のディレクティブに関するこの質問を参照してくださいRewriteBase。つまり、複数指定することはできません。最後の RewriteBaseディレクティブが優先され、.htaccessファイル全体に影響します。
MrWhite 2013

24
-1; この答えは他の人を助けたようですが、私には完全に不透明です。RewriteBase書き直しのベースを提供するために使用できる」と推測できたかもしれませんが、これは単語の並べ替えにすぎません。ただし、このコンテキストでの「ベース」とは何か、またRewriteBase行が削除された場合、指定した例は異なります。マニュアルに戻る...
Mark Amery

89

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の下のパスに対して正しく検出します。

  • Aliasディレクティブを使用しています

  • .htaccess書き換えルールを使用して、(サイレント書き換えではなく)相対URLへのHTTPリダイレクトを実行している

このような場合は、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/

以上です。


私にとって、私は逃したRewriteEngine On。たとえば1and1では必要ありませんが、専用サーバーでは必要です。
Portekoi

41

申し訳ございませんが、RewriteBaseは、mod_rewriteが.htaccessサイトのルートではなくファイルで実行されており、実行されているフォルダーの(ファイルシステムパスではなく)間違ったWebパスを推測する場合にのみ使用されます。あなたにマップされているフォルダー内の.htaccess内のRewriteRuleをhttp://example.com/myfolder使用できます

RewriteBase myfolder

mod_rewriteが正しく機能していない場合。

この問題を修正するのではなく、何か異常なことをするためにそれを使おうとすると、混乱するレシピのように聞こえます。


2
末尾にスラッシュを付ける必要がありますか?
Pacerier 2014年

@ self、No。テスト済み、およびここでサブ説明:stackoverflow.com/a/11443194/632951
Pacerier

23

RewriteBaseは、サイトのルートに.htaccessしか配置できない状況でのみ役立ちます。それ以外の場合は、サイトの別のディレクトリに別の.htaccessファイルを配置し、RewriteBaseディレクティブを完全に省略したほうがよい場合があります。

最近、複雑なサイトの場合、テストからファイルの展開を1ステップだけ複雑にするため、それらを削除しています。


22
これは良いアドバイスかもしれませんが、これは質問に対する答えではありません。したがって、それは質問に対するコメントであるべきであり、(多くの)賛成票を受け取っておらず、「回答」として間違いなく受け入れられていないはずです。
キサキ

3
「別の.htaccessファイルを別のディレクトリに配置することをお勧めします」-これが良いアドバイスかどうかはわかりませんか?サイト全体に.htaccessファイルが点在していると、デバッグ/メンテナンスが悪夢になる可能性があります。私はあなたのサイトのルートに1つの.htaccessファイルを置くことが望ましいと言っていただろう。
MrWhite 2013

1
@ w3dタイミングの問題もあります。サブディレクトリにアクセスするたびに、複数の.htaccessファイルが解析されます(ルートから現在のサブディレクトリまで)。それはルールの多くが含まれている場合でも、ルートに単一のファイルとは対照的に、ファイルの多くは、要求に対する全体的な答えの速度を下げることができた...
Erenorパズ

19

開発時には、フォルダー内の別のドメインにあります。サイトをライブにすると、そのフォルダはもう存在しません。RewriteBaseを使用すると、両方の環境で同じ.htaccessファイルを使用できます。

ライブ時:

RewriteBase /
# RewriteBase /dev_folder/

開発時:

# RewriteBase /
RewriteBase /dev_folder/

4
これはいつもうまくいくとは限りません。たとえばディレクティブで使用%{REQUEST_URI}した場合はどうなりますRewriteCondか?
MrWhite 2013

1
user1669830 @あなただけの1のRewriteRuleを持っていれば、あなただけのRewriteRuleにベースを追加した可能性がstackoverflow.com/a/46541685/632951
Pacerier

18

私が見つけた最も明確な説明は、現在の2.4 Apacheドキュメントではなく、バージョン2.0にありました

#  /abc/def/.htaccess -- per-dir config file for directory /abc/def
#  Remember: /abc/def is the physical path of /xyz, i.e., the server
#            has a 'Alias /xyz /abc/def' directive e.g.

RewriteEngine On

#  let the server know that we were reached via /xyz and not
#  via the physical path prefix /abc/def
RewriteBase   /xyz

どのように機能しますか?あなたがApacheハッカーのために、この2.0のドキュメントは「内部処理ステップに関する詳細な情報」を提供し続けます。

教訓:「現在」に精通している必要がありますが、宝石は肛門にあります。


3

このコマンドは、書き換えのベースURLを明示的に設定できます。ドメインのルートから開始する場合は、RewriteRuleの前に次の行を含めます。

RewriteBase /

2

Apacheのドキュメントからのこの抜粋は、以前の回答をよく補完していると思います。

このディレクティブは、次の条件のいずれかが当てはまらない場合に、ディレクトリごとの(htaccess)コンテキストの置換で相対パスを使用する場合に必要です。

  • 元の要求と置換は、DocumentRootの下にあります(エイリアスなどの他の手段では到達できません)。

  • RewriteRuleが含まれているディレクトリへのファイルシステムパスの後に接尾辞を付けた相対パスも、サーバー上のURLパスとして有効です(これはまれです)。

前述のように、他のコンテキストでは、ルールを短くすることのみが役立ちます。さらに、前述したように、htaccessファイルをサブディレクトリに配置することで同じことを実現できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.