Nginxの特定のlocation
ブロックにのみいくつかのヘッダーを設定しようとしています。
私が抱えている問題は、それらのlocation
ブロックにrewrite
ステートメントが含まれていることです。これは、カスタムヘッダーを削除しているようです。
この例では、次の2つのルールが必要です。
/static
_内のファイルには、_expires max;
_(ヘッダー_Cache-Control: max-age=some huge value
_および_Expires: some future date really far off
_を設定)があり、名前が_/static
_を含まないものに書き換えられている必要があります。Cache-Control: public
_が必要です(_max-age
_はありません)これが私が試した構成です:
_server {
listen [::]:80;
root /somepath;
location /static {
expires max;
rewrite /static(.*) /whatever$1;
}
add_header Cache-Control public;
}
_
そして、次のディレクトリ構造を持っています:
_/somepath
/somepath/f1.txt
/somepath/static/f2.txt
_
次に、次のようになります。
f1.txt
_:_Cache-Control: public
_、Expires
ヘッダーなしf2.txt
_:_Cache-Control: public
_、Expires
ヘッダーなしこれは_f1.txt
_には有効ですが、_f2.txt
_には有効ではありません。私はそれをこのようにしたい:
f1.txt
_:_Cache-Control: public
_、Expires
ヘッダーなしf2.txt
_:_Cache-Control: max-age=some huge value
_、_Expires: some future date really far off
_この問題は、rewrite /static(.*) /whatever$1;
行に起因していると思います。これにより、nginxはこれまでに追加したヘッダーをキャンセルしてから、再度追加します(したがって、_Cache-Control
_を再度追加します)。そのため、簡単な回避策は次のようになります。
_server {
listen [::]:80;
root /somepath;
location /static {
rewrite /static(.*) /whatever$1;
}
location /whatever {
expires max;
}
add_header Cache-Control public;
}
_
問題は、私の実際の設定ファイルでは、rewrite
がそれほど見栄えが良くないことです。書き直されたURLは簡単には一致しません _expires max
_を持つべきではないいくつかのファイルとも一致しない方法であるため、この回避策を実際に使用することはできません。
それらのヘッダーをrewrite
の後に固定する方法はありますか?
[〜#〜] edit [〜#〜]:実際のURLは次のようになります。
_location ~ /(?:posts-)?img/.*-res- {
access_log off;
expires max;
rewrite "/img/(.*)-res-.{8}(.*)" /img/$1$2;
rewrite "/posts-img/(.*)-res-.{8}(.*)" /posts/$1$2;
}
_
_/img
_にlocation
ブロックを追加して、最初のrewrite
ルールを使用して書き換えられたファイルを処理することはできますが、2番目のルール(_/posts
_)に追加することはできません。 )_/posts
_内の一部のファイルはキャッシュ可能なリソースではないため、_expires max
_を含めるべきではありません。
編集2:完全な構成(または少なくともすべての関連部分を含む):
_server {
listen [::]:80;
root /somepath;
server_name domain.tld;
location ~ /(?:posts-)?img/.*-res- {
access_log off;
expires max;
rewrite "/img/(.*)-res-.{8}(.*)" /img/$1$2;
rewrite "/posts-img/(.*)-res-.{8}(.*)" /posts/$1$2;
}
add_header Cache-Control public;
}
_
ディレクトリ構造:
_/somepath
/somepath/img/f1.png
/somepath/posts/post1.html
/somepath/posts/d1/f2.png
/somepath/posts/d2/f2.png
_
HTTPリクエストに応じて予想される動作:
GET /somepath
_:_/somepath
_と_Cache-Control: public
_を提供しますGET /somepath/img/f1.png
_:_/somepath/img/f1.png
_と_Cache-Control: public
_を提供しますGET /somepath/img/f1-res-whatever.png
_:_/somepath/img/f1.png
_によって送信されたヘッダーとともに_expires max
_を提供しますGET /somepath/posts/post1.html
_:_/somepath/posts/post1.html
_と_Cache-Control: public
_を提供しますGET /somepath/posts/d1/f2.png
_:_/somepath/posts/d1/f2.png
_と_Cache-Control: public
_を提供しますGET /somepath/posts-img/d1/f2-res-whatever.png
_:_/somepath/posts/d1/f2.png
_によって送信されたヘッダーとともに_expires max
_を提供しますこれは機能するはずです(ただし、これはやや単純な構成で検証しました)。ちなみに、Igor Sysoevは、正規表現の場所をできるだけ使用しないことをお勧めします。
location /img {
if ($arg_max) { expires max; }
...
}
location /posts-img {
if ($arg_max) { expires max; }
...
}
location ~ /(?:posts-)?img/.*-res- {
access_log off;
expires max;
rewrite "/img/(.*)-res-.{8}(.*)" /img/$1$2?max=1;
rewrite "/posts-img/(.*)-res-.{8}(.*)" /posts/$1$2?max=1;
}
大文字と小文字を区別しない場合 ロケーションマッチング 。
location ~* /static/
大文字と小文字を区別しない場合は、「*****」を削除してください
location ~* /static/
ソースNginxロケーションディレクティブ ドキュメント