私は、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
.
質問は次のとおりです。ブラウザのアドレスを変更せずに同じことを実行できますか?
RewriteRule ^(.*)$ http://example.com/%1/$1 [L,NC,QSA]
RewriteRule
substitutionで絶対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を追加する必要があります(さらに一般化できますか?)。