web-dev-qa-db-ja.com

Apache .htaccess mod_rewrite:[NC]の使用

.htaccessフラグを含む[NC]の例がたくさんあります(NoCase =大文字と小文字を区別しません)

たとえば、有名なh5bpページは[NC]フラグを多く使用しています:
https://github.com/h5bp/server-configs-Apache/blob/master/dist/.htaccess

ほぼすべての例で、RewriteCondディレクティブの最後に[NC]フラグが付けられます。
しかし、 公式ドキュメント は、RewriteRuleディレクティブにのみ使用されることを明確に示しています。

例の99%は間違っていますか?
公式文書は間違っているか不完全ですか?

4
Gregory MOUSSAT

ただし、公式ドキュメントには、RewriteRuleディレクティブにのみ使用されることが明記されています。

ドキュメントでは、RewriteRuleディレクティブでonlyしか使用できないとは言っていません。リンクするページ(これは、特にRewriteRuleフラグに関するものです)には次のように記載されています。

[NC]フラグを使用すると、RewriteRuleは大文字と小文字を区別しない方法で一致します。

RewriteCondディレクティブのドキュメント には、このディレクティブで使用できるフラグに関するセクションが含まれています。これらには、NCOR、およびNVが含まれます。 NCフラグは両方のディレクティブに共通です。

RewriteCondディレクティブで無効なフラグを使用した場合、500内部サーバーエラーが発生します。また、サーバーのエラーログを調べると、「無効なフラグ」に関する情報が表示されるはずです。

ただし、(ちょっとした話ですが)、NCフラグは一般的に使いすぎです。本当に必要ない場合(または、さらに悪いことに、実際に問題が発生する場合)は、多くの場合、デフォルトで含まれています。


UPDATE:リンクされたドキュメントが過去数年で更新されたかどうかはわかりませんが、使用されているNCフラグは3つだけですRewriteCondディレクティブを使用します。最初の2つは確かに正当化され、3つ目は議論の余地のあるIMOです。

#376   RewriteCond %{HTTP_Host} ^www\.(.+)$ [NC]

ホスト名(Hostヘッダーの値)を解決するときは、常に(HTTP仕様に従って)大文字と小文字を区別せずに比較する必要があります。すべての主流のブラウザーは、要求を行うときにHostヘッダーを小文字にします。ただし、他のユーザーエージェント(およびボット)はそうではなく、mod_rewriteはデフォルトで大文字と小文字を区別して自然に比較します。必ずしもNCフラグを使用する必要があるという意味ではありません。これは、実行している内容に依存するためです。

ただし、このルールの目的は、NCwwwwwwのいずれであっても、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を使用しているため、おそらく失敗します。敏感です。

5
MrWhite