web-dev-qa-db-ja.com

.htaccessを使用して、さまざまなドメインをさまざまなサブディレクトリに書き換え、サブディレクトリをマスクするにはどうすればよいですか?

アドオンドメインを無制限に許可する共有ホスティングプランがありますが、それらはパブリックルート(/)のみを指すことができます。 .htaccessを使用して、異なるドメインが対応するサブディレクトリを指すようにします。例えば、

site1.comはサブディレクトリ/site1/を指します
site2.comはサブディレクトリ/site2/を指します

ユーザーにsite1/またはsite2/を見せたくない。私の.htaccess以下almostは動作します。ユーザーがsite2.com/test/などのサブディレクトリに移動すると(末尾のスラッシュ/に注意してください)、うまく機能します。ただし、ユーザーが末尾のスラッシュを省略すると、ブラウザにsite2.com/site2/test/と表示されます。

だから私の質問は、ユーザーが末尾のスラッシュを入力するかどうかにかかわらず、どのようにサブディレクトリをマスクできますか?

私のルート.htaccessは次のようになります(より多くのドメインでのみ、すべて同じドメインごとの3行形式で)

RewriteEngine On

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

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

さまざまなオンラインソースからさまざまなことを試しましたが、何も機能しません。ほとんど機能したことの1つ($1の後のスラッシュに注意してください):

RewriteRule ^(.*)$ /site2/$1/ [L]

これは、ファイル名が省略されたときに正しく機能します-site2.com/test/-しかし、site2.com/test/index.phpに移動すると、「入力ファイルが指定されていません」と表示されます。

ルートの唯一のファイルは.htaccessであり、他のすべてはサブディレクトリにあります。

編集:質問を書き直し、無関係な詳細を省略します。

5
akTed

私は最終的に解決策を見つけました。の 上記のコードの2番目のRewriteCondは不要であり、 B&TのTips&Scripts にある最初のRewriteRuleは、存在しない場合は末尾のスラッシュを追加します(index.phpのようなファイルでない限り)。これが私の新しい.htaccessです。 末尾のスラッシュディレクティブは一度だけ適用する必要があることに注意してください。

.htaccess

RewriteEngine On

#ADD TRAILING SLASH TO DIRECTORY IF NONE EXISTS
RewriteRule ^([^\.]+[^/])$ http://%{HTTP_Host}/$1/ [L]

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

RewriteCond %{HTTP_Host} ^(www.)?site2.com$ [NC]
RewriteCond %{REQUEST_URI} !site/ [NC]
RewriteRule ^(.*)$ /site2/$1 [L]

編集

私は元々、上記の各トリプレットから2番目のRewriteCondを削除しましたが、それは私のメインサイトと他のいくつかのサイトで機能しました。私は完全にテストしませんでしたが、後で使用したことがない他のいくつかのドメインが機能していなかったことを発見しました(500個の内部エラーが発生しました)。 2番目のRewriteRuleを再び追加すると、再び機能します。

奇妙なのは、workingテストドメインサブディレクトリの1つを削除して再作成した後、書き換え(2番目のRewriteCondなし)作業を停止しました(500エラーをスロー)。 2番目のRewriteCondを追加すると、再び機能するようになりました。

ああ、まあ、私はそれがmod_rewrite...の魔法にそれをチョークするだろうと思う...それが機能している限り。

4
akTed