13

画像を保存する「アバター」、「記事」、「トレンド」の3つの異なるストックエリアがあります。

URL「/trends/123.jpg」をトレンドフォルダに「/avatars/23.jpg」をアバターなどに「リンク」したい。

構成 1:

server
{
    listen 8089;
    server_name localhost;

    root /var/www;

    location /trends/
    {
            alias  /var/storage/hottrend/;
    }

    location ~* ^.+\.(jpeg|gif|png|jpg)
    {
            add_header Cache-control "public";
            access_log   off;
            expires      90d;
    }
}

構成 1 : 「GET /trends/123.jpg」が /trends/ の場所と一致しないのはなぜですか?

構成 2:

server
{
    listen 8089;
    server_name localhost;

    root /var/www;

    location ~ ^/trends/(.*)\.jpg$
    {
            rewrite ^/trends/(.*)$ /$1 break;

            root  /var/storage/hottrend;
    }

    location ~* ^.+\.(jpeg|gif|png|jpg)
    {
            add_header Cache-control "public";
            access_log   off;
            expires      90d;
    }
}

構成 2: キャッシュ関連の最後のルールが一致しません。異なる場所/ルートから JPG ファイルをサーバーに送信するための最良の方法は何ですか?

4

3 に答える 3

33

2 つの構成には、異なるが関連する問題があります。2 つの問題は次のとおりです。

  1. 場所の順序が一致します。と
  2. 場所が一致するとどうなるか。

最初にそれがどのように機能するかを説明し、次に構成について説明します。

使い方

ロケーションマッチング

このnginx wiki ページで詳細を確認できますが、私はいつも言葉遣いがわかりにくいと感じています。(動作の説明に実装の詳細が混在しています。) これは、場所が次の順序で一致することを意味します。

  1. のような完全一致location = /robots.txt
  2. 次のような熱心な非正規表現プレフィックスlocation ^~ /trends/
  3. location ~* \.(jpg|png)、または大文字と小文字を区別する正規表現一致location ~ \.(jpg|png)
  4. location /trends/またはのような怠惰な非正規表現プレフィックスlocation /

複数の正規表現が一致する場合、最初の一致が他よりも優先されます。複数の正規表現以外のプレフィックスが一致する場合、最も具体的な一致が選択されると思います-これを確認して更新します。

ロケーション行動

一致する場所は、指定されたコンテンツを提供する責任があります。また、キャッシュ制御ヘッダーなどの提供も担当します。特定の URL パターンに一致する場所を指定して特定のヘッダーを適用できますが、その場所もコンテンツを提供する必要があります。コンテンツを提供できない場合は、404 エラーが発生する可能性が高く、他の一致する場所は検索されません。

最後に、ある場所で書き換えを行う場合は特に注意してください。内部リダイレクトは、一部のディレクティブよりも前に発生する可能性があります。その場合、リダイレクトによって場所が再度検索される前に、それらのディレクティブが適用されないことがあります。

構成 1

トレンドの場所は怠惰な非正規表現のプレフィックスであるため、正規表現の場所が一致しない場合にのみ一致します。これは、次のような積極的な非正規表現一致を使用して修正できます。

location ^~ /trends {
    ...
}

ただし、そうすると、他の構成の問題が浮き彫りになります。

構成 2

jpg ファイルと一致する可能性のある場所が 2 つあります。成功するのは1つだけです。最初の場所が一致した場合、2 番目の場所のキャッシュ制御は適用されません。2 番目が一致する場合、エイリアスは有効になりません。

修正は、必要なすべてのディレクティブが一致する場所に適用されるようにすることです。次のように、1 つのファイルで明示的に指定できます。

location ^~ /trends
{
    alias /var/storage/hottrend;

    add_header Cache-control "public";
    access_log   off;
    expires      90d;
}

location ~* ^.+\.(jpeg|gif|png|jpg)
{
    add_header Cache-control "public";
    access_log   off;
    expires      90d;
}

複数の場所に適用する必要があるディレクティブを管理するためのより適切なソリューションは、それらの詳細を別のファイルに分割しincludeてから、両方の場所に配置することです。(Mohammad AbuShady は彼の例でそうしました。) 次のようなもの:

# Inside your main .conf
location ^~ /trends
{
    alias /var/storage/hottrend;
    include image-headers.conf;
}

location ~* ^.+\.(jpeg|gif|png|jpg)
{
    include image-headers.conf;
}

# Inside image-headers.conf
add_header Cache-control "public";
access_log   off;
expires      90d;
于 2013-10-01T08:59:17.740 に答える
0

Nginx は、構成ファイルに表示される順序で正規表現として定義された場所をチェックし、最初に一致する式の場所を使用します。

location ~\.jpg$したがって、正規表現として定義されている他の場所の前に必ず表示する必要があります

于 2013-10-01T07:51:15.763 に答える