HTTP_HOSTを使用した<if>ステートメント内のhtaccessRewriteRule

Sep 21 2020

1つのページ(index.php?pageid = x)を使用するカスタムサイトデザインの1つの.htaccessファイルから、1つのサーバーで複数のサイトを実行します。ページIDに応じて、異なるコンテンツ/レイアウトをトリガーします。

各サイトで、.htccess内のIFステートメントを使用しています。例:

<If "%{HTTP_HOST} == 'site.com'">     
RewriteRule goes here
</If>

IFステートメントがない場合は、次のような書き換えルールを使用します。

RewriteRule ^fr/cookie-policy/$ /index.php?pageid=11 [L]

上記のルールは計画どおりに機能しますが、IFステートメント内でこのルールを使用すると機能しません。先頭の^を削除して、/に交換する必要があります。しかし、これは、指定されたパターンで終わりに一致するため、理想からはほど遠いものです。

誰かが解決策を提案できますか?私が欠けているものは何ですか?

回答

2 MrWhite Sep 22 2020 at 08:44

<If>容器は、処理の順序を変更します。<If>コンテナは非常に遅くマージされます。参照:Apacheドキュメントでセクションがどのようにマージされるか

これにより、リクエストがマップされた絶対ファイルシステムパスとRewriteRule<If>照合内のディレクティブが生成されます。これには、ディレクトリプレフィックスが含まれます。これは、通常、ディレクトリコンテキスト(つまり.htaccess)で照合するときに削除されます。(<If>セクションが処理されるときに、要求がファイルシステムにマップされている可能性がありますか?)

RewriteRule ^fr/cookie-policy/$ /index.php?pageid=11 [L]

したがって、fr/cookie-policy/がドキュメントルートに相対的であり、DocumentRoot/var/www/user/public_htmlこれと正確に一致する場合は、と一致する必要があります/var/www/user/public_html/fr/cookie-policy/

追加の条件を使用しない限り(そしてREQUEST_URIサーバー変数をチェックしない限り)これを回避する方法はわかりませんが、それはポイントを打ち負かすように見えます(そして効率が低下します)。

指定されたパターンで終わりに一致します。

完全な絶対ファイルパスを指定せずに、親ディレクトリ(つまり、ドキュメントルートの上にあるディレクトリ)を含めるだけで、このような事態が発生する可能性を減らすことができます。例えば。public_html/fr/cookie-policy/$


<If>セクション内でmod_rewriteを使用する際に気付いた他のいくつかの(奇妙な)警告:

  • 相対パスに書き換えることはできません(つまり、スラッシュまたはスキーム+ホスト名で始まらない)。スラッシュ(つまり、ルート相対)で始める必要があります。通常、ディレクトリコンテキストで相対パスに書き換えると、ディレクトリプレフィックスが追加されます。ただし、<If>コンテナ内では、ディレクトリプレフィックスは-と見なされているように見えます。*If/これにより、「400 BadRequest」が発生する可能性があります。(おそらくこれは、<If>セクションがマージされた時点で、ディレクトリプレフィックスがすでに追加されているためですか?)

  • 上記に関連して、RewriteBaseディレクティブは「無視」されます。

  • セクションの他のmod_rewriteディレクティブ<If>(少なくとも同じコンテキスト内)は同じ動作をするように見え、完全な絶対ファイルシステムパスとのみ一致するようになりました。

  • <If>セクションが「遅れて」マージされているにもかかわらず。これらは、セクション外の他のmod-rewriteディレクティブの前に処理されます<If>。ディレクティブの順序に関係なく。(少なくとも同じコンテキストで。)

  • 参照:htaccessのHTTP_HOSTの条件はPHPを壊します

通常、HTTP_HOST特定の書き換えを適用する前にチェックする必要がある場合は、前のRewriteCond(条件)でこれをチェックします。しかし、あなたはすでにそれを知っています