web-dev-qa-db-ja.com

URLを変更せずにサブドメインをフォルダーに書き換えます

私は、Apacheとの安価な共有ホスティングで、.htaccessを使用して次の書き換えをしようとしています。

  • http://anything.example.com/par1/par2 => http://example.com/anything/index.php?a=par1&b=par2

これを行うには、ルートディレクトリに次の.htaccessファイルがあります。

RewriteEngine on
RewriteCond %{HTTP_Host} ^(.*)\.example\.com
RewriteRule ^(.*)$ http://example.com/%1/$1 [L,NC,QSA]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ $1/index.php?section=$2&page=$3 [L]

そして、これは実際に機能します。問題は、http://digitalcameras.example.com/nikon/123をWebブラウザのアドレス文字列に入力してEnterキーを押すと、文字列が次のようになることです。

http://example.com/digitalcameras/nikon/123

digitalcameras部分が最初から中央に移動したことに注意してください)。

index.phpフォルダーに配置された/digitalcameras.

質問は次のとおりです。ブラウザのアドレスを変更せずに同じことを実行できますか?

3
Roman Matveev
RewriteRule ^(.*)$ http://example.com/%1/$1 [L,NC,QSA]

RewriteRulesubstitutionで絶対URL(スキーム+ホスト名)を指定すると、暗黙的にexternal redirect-がトリガーされます。

ただし、サブドメインとメインドメインがすべて同じ共有ホスティングアカウント(つまり、同じファイルシステム)にある場合は、susbstitutionで完全なドメインを明示的に指定する必要はありません。ファイルシステムのパスを指定します。

例えば:

RewriteRule (.*) /%1/$1 [L]

NCおよびQSAフラグはここでは不要なようです。 substitutionにクエリ文字列を明示的に含めない限り、クエリ文字列はデフォルトで追加されます。また、パターンアンカー(^および$)は、すべてに一致.*パターンを使用する場合にも必要ありません。


PDATE#1:最初のRewriteRuleは不要なようです。これはwildcardサブドメインなので、サブドメインはメインドメインと同じドキュメントルートを指していると想定します。

あなたが本当にやろうとしているのは内部的に書き換えるhttp://anything.example.com/par1/par2/anything/index.php?a=par1&b=par2に同じサブドメインで。

代わりに次を試してください。

RewriteEngine on
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_Host} ^(.*)\.example\.com [NC]
RewriteRule ^([^/.]+)/([^/.]+)/?$ %1/index.php?section=$1&page=$2 [L,QSA]

元のリクエスト(きれいなURL)にクエリ文字列を含めることができる場合は、QSAフラグがここで必要です。

リテラルドットに一致させるために、文字クラスのドットをエスケープする必要はありません。

REDIRECT_STATUS環境変数に対するRewriteCondディレクティブのチェックにより、潜在的な書き換えループ(ブラウザーで500エラーが発生する)が防止されます。

PDATE#2:ドメインの明示的な使用を回避するために(たとえば、example.com)、最初のドメインセグメントを一致させることができます。最初のドットまで。例えば:

RewriteCond %{HTTP_Host} ^([^.])+

ただし、これはメインの頂点ドメイン(またはwww)にも一致しますが、それをブロックするディレクティブが既にある場合を除きます。このようにメインドメインにアクセスすることは厳密に無効だと思いますか?ただし、スクリプトがこのような無効なリクエストを404で処理する場合、これは問題ないかもしれません。

または、wwwを除くメインドメインのサブドメインのみを照合するには、次を試してください。

RewriteCond %{HTTP_Host} !^www\. [NC]
RewriteCond %{HTTP_Host} ^([^.])+\.[a-z-]\.(com|co\.uk|net) [NC]

必要に応じてTLDを追加する必要があります(さらに一般化できますか?)。

1
MrWhite