.htaccess
フラグを含む[NC]
の例がたくさんあります(NoCase =大文字と小文字を区別しません)
たとえば、有名なh5bpページは[NC]
フラグを多く使用しています:
https://github.com/h5bp/server-configs-Apache/blob/master/dist/.htaccess
ほぼすべての例で、RewriteCond
ディレクティブの最後に[NC]
フラグが付けられます。
しかし、 公式ドキュメント は、RewriteRule
ディレクティブにのみ使用されることを明確に示しています。
例の99%は間違っていますか?
公式文書は間違っているか不完全ですか?
ただし、公式ドキュメントには、RewriteRuleディレクティブにのみ使用されることが明記されています。
ドキュメントでは、RewriteRule
ディレクティブでonlyしか使用できないとは言っていません。リンクするページ(これは、特にRewriteRule
フラグに関するものです)には次のように記載されています。
[NC]フラグを使用すると、RewriteRuleは大文字と小文字を区別しない方法で一致します。
RewriteCond
ディレクティブのドキュメント には、このディレクティブで使用できるフラグに関するセクションが含まれています。これらには、NC
、OR
、およびNV
が含まれます。 NC
フラグは両方のディレクティブに共通です。
RewriteCond
ディレクティブで無効なフラグを使用した場合、500内部サーバーエラーが発生します。また、サーバーのエラーログを調べると、「無効なフラグ」に関する情報が表示されるはずです。
ただし、(ちょっとした話ですが)、NC
フラグは一般的に使いすぎです。本当に必要ない場合(または、さらに悪いことに、実際に問題が発生する場合)は、多くの場合、デフォルトで含まれています。
UPDATE:リンクされたドキュメントが過去数年で更新されたかどうかはわかりませんが、使用されているNC
フラグは3つだけですRewriteCond
ディレクティブを使用します。最初の2つは確かに正当化され、3つ目は議論の余地のあるIMOです。
#376 RewriteCond %{HTTP_Host} ^www\.(.+)$ [NC]
ホスト名(Host
ヘッダーの値)を解決するときは、常に(HTTP仕様に従って)大文字と小文字を区別せずに比較する必要があります。すべての主流のブラウザーは、要求を行うときにHost
ヘッダーを小文字にします。ただし、他のユーザーエージェント(およびボット)はそうではなく、mod_rewriteはデフォルトで大文字と小文字を区別して自然に比較します。必ずしもNC
フラグを使用する必要があるという意味ではありません。これは、実行している内容に依存するためです。
ただし、このルールの目的は、NC
、www
、www
のいずれであっても、wWw
サブドメインを削除することであるため、WWW
フラグはここで正当化されます。 NC
フラグがないと、(悪意のある)ユーザーエージェントはWWW.EXAMPLE.COM
を送信し、ドメインの頂点への正規リダイレクトを回避できます。
#408 RewriteCond %{HTTP_Host} !^www\. [NC]
これはnegated正規表現(!
プレフィックスで示される)であることに注意してください。このルールの目標は、ドメインの頂点からwww
サブドメインにリダイレクトすることです。 NC
ヘッダーがHost
またはwww
などで始まる場合、リダイレクトを防止するため、WWW
フラグはここで正当化されます。そうしないと、www.WWW.example.com
などの不正なリダイレクトが発生する可能性があります。
#564 RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC]
ここでのNC
フラグの使用は議論の余地のあるIMOです。このルールブロックの目的は、.well-known
ディレクトリを除く、ドットファイルとディレクトリへのアクセスをブロックすることです。せいぜい、それはおそらく余計なことですが、NC
フラグを使用しない、ファイルで以前に使用された同様の条件(行番号345-7)と矛盾します。
.well-known
ディレクトリshouldは常に小文字です。したがって、NC
フラグshouldは不要です。ただし、ここにNC
フラグを含めると、.WELL-KNOWN
という形式のリクエストをallowing(ブロックしない)になります。これは、おそらくLinuxを使用しているため、おそらく失敗します。敏感です。