1

.htaccess設定で奇妙な状況が発生しました。ドメインごとに1つのディレクトリを持つマルチドメインホスティングがあります。たとえば、私は次のようにしています。

http://www.domain1.com
http://www.domain2.com

および次のディレクトリ構造:

/domain1/
/domain1/index.php
/domain2/
/domain2/index.php
/domain2/subdirectory/
/domain2/subdirectory/index.php

および.htaccess次の内容のファイル:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(www\.)?domain1\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/domain1/.*$
RewriteRule ^(.*)$ domain1/$1 [L]

RewriteCond %{HTTP_HOST} ^(www\.)?domain2\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/domain2/.*$
RewriteRule ^(.*)$ domain2/$1 [L]

1つの例外を除いて、すべてが好きなように機能します。

http://www.domain2.com/subdirectory/

(最後にスラッシュが付いています)コンテンツは適切に表示され、アドレスバーのURLは変更されませんが、次の場合は次のようになります。

http://www.domain2.com/subdirectory

(最後にスラッシュなしで)コンテンツは正しく表示されますが、アドレスバーのURLは次のように変更されます。

http://www.domain2.com/domain2/subdirectory/

(サブディレクトリ名とスラッシュが最後に追加されていることに注意してください)そして、ユーザーがアドレスバーにその変更を表示するのが好きではありません。それが私の問題です。

4

1 に答える 1

1

これは、URIファイルマッピングパイプラインmod_dirDirectorySlash妨害しています。デフォルトDirectorySlashではオンになっています。これにより、apacheがリクエストがディレクトリに対するものであると判断し、末尾のスラッシュが欠落している場合、301は末尾のスラッシュを使用してURIにリダイレクトします情報開示のセキュリティ上の懸念がある可能性があるため、これを行うのには十分な理由があります。ディレクトリのインデックス作成を許可しない場合は、オフにすることができます。

DirectorySlash Off

そして、Apacheは末尾のスラッシュにまったくリダイレ​​クトしません。または、書き換えエンジンの一部として自分でリダイレクトを行うこともできます。内部で書き換えられたURLが公開される理由は、2つのモジュールがURI、mod_dir、およびmod_rewriteをマングリングしており、お互いを認識せずにそれを実行しているためです。したがって、URIはmod_rewriteによって書き換えられ、mod_dirが表示され、「これはディレクトリです!」と表示され、末尾にスラッシュを追加してURIをさらにマングルし、リダイレクト応答のフラグを立てます。最終的に、取得するのは、マングルされたURIを使用したリダイレクトです。mod_rewrite内からリダイレクトを処理することにより、mod_dirに到達するまでに、すべてが桃色になります。

これらは現在のルールを上回っている必要があります

RewriteCond %{HTTP_HOST} ^(www\.)?domain1\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/domain1/.*$
RewriteCond %{DOCUMENT_ROOT}/domain1%{REQUEST_URI} -d
RewriteRule ^(.*[^/])$ /$1/ [L,R=301]

RewriteCond %{HTTP_HOST} ^(www\.)?domain2\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/domain2/.*$
RewriteCond %{DOCUMENT_ROOT}/domain2%{REQUEST_URI} -d
RewriteRule ^(.*[^/])$ /$1/ [L,R=301]
于 2012-09-24T05:54:22.723 に答える