web-dev-qa-db-ja.com

ネストされた場所が正しく機能しない

このnginx構成の一部をデバッグできません。
.pdfファイルのすべてのリクエストにヘッダーを追加したい
次に、不要なブラウザのキャッシュを回避するために、veiwディレクトリに追加したトークンを削除します。

location /static {
    location ~* \.pdf$ {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }
    #Remove Anti cache token
    rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;
    ...
}

Nginx構文エラーはありませんが、.pdf forをリクエストすると、404 not foundエラーが表示され、リクエストに書き換えが適用されないことが示されます。

どんな助けでも大歓迎です
ありがとうございました

2
mahyard

nginxlocationを選択してリクエストを処理する場合、内部または外部のlocationブロックを選択できます。両方のステートメントを組み合わせることはありません。

rewriteは、ネストされたlocationによって継承されません。 rewriteをすべての場所に適用する場合は、serverブロックスコープに配置する必要があります。

rewriteステートメントの正規表現は十分に具体的であり、そのまま移動できます。

例えば:

rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;

location /static {
    location ~* \.pdf$ {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }
    ...
}

もちろん、両方のrewriteブロックでlocationステートメントを繰り返すだけの方が効率的です。


別のアプローチは、rewriteを完全に回避し、正規表現locationを使用して、aliasディレクティブを使用してアンチキャッシュトークンを削除することです。詳細は このドキュメント を参照してください。

例えば:

location ~ "^(?<prefix>/static)[0-9]{10}(?<suffix>/.*)$" {
    alias /path/to/root$prefix$suffix;

    location ~* \.pdf$ {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }
    ...
}

正規表現locationブロックは、locationブロックの前に付ける評価順序が異なることに注意してください。詳細は このドキュメント を参照してください。

5
Richard Smith

この質問に対する最良の答えは、私が問題を解決するために使用したソリューションを投稿したいものとして私がチェックしたものです。一部のリクエストにヘッダーを追加するために、ネストされたロケーションブロックを定義する必要はありません。代わりに、ifを使用して正規表現の条件を確認し、必要な処理を実行しました。
これを処理するために書いた次のブロックを見てください。

location /static {
    if ( $request_uri ~* \.pdf$ ) {
        add_header Access-Control-Allow-Origin *;
        add_header Content-Disposition 'inline';
    }

    #Remove Anti cache token
    rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;
    ...
}
0
mahyard