Nginxロケーション選択アルゴリズム

nginxを構成する場合、場所選択アルゴリズムが必要です。 ただし、nginxの公式Webサイト(2018年)では、一部の場所が相互に埋め込まれている場合や、インターネット上の記事で根本的に誤ったアルゴリズムが指定されている場合の選択アルゴリズムについては何も言われていません。 また、この記事では脆弱な構成の例を示します。



1レベルのネストがある特別なケース



nginxを初めて使用する場合は、ネストされた場所を使用せずに特別なケースを最初に検討する必要があります。これは、特別なケースのアルゴリズムがはるかに簡単だからです。



  1. まず、平等(=)が求められます。 最も高い優先度があります。
  2. 次に、プレフィックスの最大位置(()または(^〜))の長さが検索され、その後、見つかった位置に優先修飾子(^〜)があるかどうかがチェックされ、ある場合はこの位置が返されます。
  3. 次に、正規表現((〜)および(〜*))が上から下にチェックされます。 一致する場合、それらの最初の場所が返されます。
  4. 次に、前に見つけたプレフィックスの場所が返されます。


ネストされた場所がある場合、このアルゴリズムは適用できないことに注意してください。



ネストされた場所を持つ一般的なケース



  1. 最上位から始めます。
  2. 現在のレベルで等号(=)が満たされると、検索は停止します。これは、そのような場所に他のネストされた場所を含めることができないためです。
  3. それ以外の場合、 現在のレベルで最大のプレフィックスの場所(()または(^〜))を探します。
    • そのようなプレフィックスの場所が存在する場合は、それを現在のレベルにして、手順2に進みます。
    • それ以外の場合は、ループを終了します。
  4. サイクルから外れています。 現時点では、「最大の」プレフィックスの場所を見つけましたが、これがすべての中で最大であるとは考えていません。 例:



    location /abc { location /abcdefghi { … } } location /abcdef { … }
          
          





    この例では、/ abcdefに移動します。彼のレベルでは、短い/ abcdefを克服したからです。 しかし、実際には場所などがあります。
  5. 見つかった場所で、最初の真の正規表現を探しています。 見つかった場合、検索は完全に停止します。 注:この時点で、多くの人が考えるように、実際には最上位ではなく、非常に低いレベルで正規表現を探しています。 つまり、正規表現検索は上からではなく下から行われます(ただし、1つのレベル内は下からではなく上から行われます)。
    • さらに、何も見つからない場合は、1レベル上に移動し、最初の正規表現を同様に探しますが、今回は、前にいた場所にラベルがなかったという条件でのみ(^〜)。 上昇する場所がなくなるまでこの点を繰り返します。
    • 次の点に注意してください。
      • いずれかのレベルにラベル(^〜)が付いていても、これは持ち上げていないという意味ではありません。 上昇は常に実行されますが、下位レベルにマーク(^〜)があった場合、現在のレベルでは正規表現検索は実行されません。
      • 最下位レベルでの正規表現チェックを禁止する可能性はありません-このため、別のネストされたレベルを作成する必要があります。 ただし、レベル0で正規表現チェックを無効にできます。このため、最初のレベル(レベル0)の場所にはラベル(^〜)が必要です。
  6. 私たちは木に登りましたが、単一の正規表現は見つかりませんでした。 正規表現が見つからない場合は、以前に見つかった「ほぼ最大の」プレフィックスの場所を返します。 できた


また同時に:





脆弱な構成の例



 location ~ \.php$ { deny all; #      php-fpm } location /posts/ { location ~ (.*)_2x(\.[az]+)$ { try_files $uri $1$2 =404; } }
      
      





この構成では、ファイルが見つからない場合は「_2x」を無視して構成しました。 たとえば、nginxは、指定されたパスとパス/posts/img/a.pngの両方で/posts/img/a_2x.pngファイルを見つけようとします。 しかし、実際には、/ posts / authData_2x.phpをリクエストすると、authData.phpスクリプトのソースコードが裸の形式で取得されます。 このようなエラーを回避するには、nginxでの場所の処理方法を知る必要があります。



また、追加の保護として、通常の場所からアクセスできない別のディレクトリにスクリプトを保存することもできます。 この場合、何らかの理由でPHPの場所が機能しない場合、ユーザーはスクリプトのソースコードではなく404エラーを受け取ります。



リダイレクトの場所



  1. try_filesに最後のパラメーターのエラーコードが含まれていない場合、最後のパラメーターは常にリダイレクトを行うため、別の場所へのリダイレクトが行われます。 注意:try_filesのエラーコードは、等号(=)を使用して記述する必要があります。
  2. indexおよびerror_pageがトリガーされると、常に別の場所にリダイレクトされます。 最後のフラグを追加すると、リダイレクションもリライトします。


その他



  1. 場所を選択するとき、「?」文字で始まるクエリ文字列は考慮されません。


免責事項



この記事のアルゴリズムは、それが正しいという事実ではなく、私個人の観察に基づいて私が編集したものです。 残念ながら、公式のドキュメントはありませんが、ソースコードを読んでいません。 誰かがアルゴリズムにエラーを見つけた場合は、個人的なメッセージまたはコメントに書いてください。



All Articles