6

目標:

共有 Apache 2.2 ボックス上の仮想サーバーで、フォルダーのサブフォルダー内のファイルをルートにあるかのよう.htaccessにシームレスに表すように構成しようとしました。public_html

つまり、ユーザーが にアクセスするとき、http://www.example.com/homeシームレスに(クライアント ブラウザーで URL を書き換えずに)からファイルを表示する必要がありますhttp://www.example.com/subfolder/home

私の.htaccessファイルは次のようになります。

RewriteEngine on
RewriteRule !^subfolder/ subfolder%{REQUEST_URI}

問題:

これは機能します、クライアント ブラウザの URL を書き換えます。

つまり、ユーザーはhttp://www.example.com/subfolder/home/アドレスバーに表示されますが、表示する必要があるのはhttp://www.example.com/home

私が行ったことは.htaccess、エンドユーザーには見えない「内部」の書き換えになるはずですが、「外部」の書き換えが行われているようです。

私は何を間違っていますか?


[編集] 追加の詳細:

ユーザーが にアクセスするwww.example.comと、から提供されたホームページ コンテンツがユーザーに表示され、ブラウザのアドレス バーに と表示されるという点で、期待どおりに機能しますpublic_html/subfolder/default.htmlwww.example.com

ただし、ユーザーがそのホームページ (コード化されたhref="/contact") の「連絡先」リンクをクリックすると、そこにwww.example.com/subfolder/contact/到達しますが、内部の書き換えではなくリダイレ​​クトを行ったかのように、ブラウザーのアドレス バーに表示されます。

その後、アドレス バーのテキストを削除し/subfolderてページを強制的にリロードすると、機能します。正しいコンテンツが読み込まれ、アドレス バーは残ります。www.example.com/contact/

実装上の注意:役立つ場合public_html/subfolder/contactは、ファイルを含むフォルダーです。default.html

別の観察:

新しいタブを開いてwww.example.com/contact/ (末尾のスラッシュに注意してください)と入力すると、期待どおりに機能します。

しかし、新しいタブを開いてwww.example.com/contact (末尾のスラッシュなし)と入力すると、 にリダイレクトされますがwww.example.com/subfolder/contact/、これは望ましくありません。

何が悪いのか教えてくれるはずだと思いますが、答えはまだわかりません。

4

1 に答える 1

16

これが発生している理由は、のためですmod_dirDirectorySlashディレクトリに対してリクエストが行われ、末尾のスラッシュが追加された同じURIに欠落していると判断した場合に、ブラウザをリダイレクトするというディレクティブがあります。問題は、mod_dirとmod_rewriteがURL/ファイルマッピングパイプラインの異なる場所に適用されることです。したがって、mod_rewriteはある時点でURIをマングルし、mod_dirがその処理を実行すると、書き換えられたURIがリダイレクトされるため、ブラウザのアドレスバーのURLが「非表示」の内部書き換えを含むように変更されます。

ここでいくつかのことができます。

  1. mod_rewriteで自分で末尾のスラッシュを適用できるため、URIがmod_dirに到達する前に、ブラウザは末尾のスラッシュを含めるようにリダイレクトされます。これは、のようなもののすべてのURLを意味し、末尾のスラッシュが含まれます。1つが欠落している場合、リライトコードはリダイレクトして1つ追加します/home/contactこのようなもので現在のルールの上にあるため、最初に適用されます。

    RewriteCond %{REQUEST_URI} !^/subfolder
    RewriteCond %{DOCUMENT_ROOT}/subfolder%{REQUEST_URI} !-f
    RewriteRule ^(.*[^/])$ /$1/ [L,R=301]
    
  2. DirectorySlashmod_dirがこのリダイレクトの実行を停止するようにオフにします。DirectorySlash Offhtaccessファイルの先頭に含めるだけです。ただし、ここでの欠点は、末尾のスラッシュが欠落している場合に情報開示のセキュリティ問題が発生する可能性があることです。


編集:

末尾にスラッシュを付けずにインデックスファイルを使用するには、インデックスファイルにマップする必要があります。ルールを次のように変更してみてください。

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/subfolder
    RewriteCond %{DOCUMENT_ROOT}/subfolder%{REQUEST_URI} -d
    RewriteRule ^(.*?)/?$ /subfolder/$1/ [L]

    RewriteCond %{REQUEST_URI} !^/subfolder
    RewriteRule ^(.*)$ /subfolder/$1 [L]
于 2012-12-27T21:10:01.633 に答える