web-dev-qa-db-ja.com

nginx:複数の一致するロケーションブロック

Max-ageヘッダーディレクティブとContent-Disposition "attachment"を次のように設定しようとします。

location / {

    # set up max-age header directive for certain file types for proper caching
    location ~* \.(?:css|js|ico|gif|jpe?g|png|mp3|mpeg|wav|x-ms-wmv|eot|svg|ttf|woff|woff2)$ {
        expires 7d;
        add_header Cache-Control "public";
    }

    # force download for ceratain file types
    location ~* \.(?:fb2|mobi|mp3)$ {
         add_header Content-Disposition "attachment";
    }
...
}

問題は、両方のロケーションブロックが一致する.mp3ファイルにあります。最初のものだけが使用されます(max-age)。 max-age and Content-Disposition "attachment"の両方を使用して.mp3を作成するにはどうすればよいですか?

2
user1876484

サーバーとロケーションブロックのマッチングはこちら に関する良い記事があります。一致できるロケーションブロックは1つだけなので、mp3ファイル専用のロケーションブロックを作成します。

 location ~*  \.mp3$ {
   expires 7d;
   add_header Cache-Control "public";
   add_header Content-Disposition "attachment";
}

Nginxは最初のロケーションブロックを同じプレフィックスで照合するため、既存の2つのブロックの前に配置するか、他の2つのブロックの一致基準からmp3を削除する必要があります。

3
Tim

最初の場所のみが使用されることを考えると、なぜこれをしないのですか?:

location / {

    # set up max-age header directive for certain file types for proper caching
    location ~* \.(?:css|js|ico|gif|jpe?g|png|mpeg|wav|x-ms-wmv|eot|svg|ttf|woff|woff2)$ {
        expires 7d;
        add_header Cache-Control "public";
    }

    # force download for ceratain file types
    location ~* \.(?:fb2|mobi)$ {
         add_header Content-Disposition "attachment";
    }

    # For mp3 files set both:
    location ~* \.mp3$ {
        expires 7d;
        add_header Cache-Control "public";
        add_header Content-Disposition "attachment";
    }

...
}
0
Barry Pollard