Nginx。キャッシュされたオブジェクトのヘッダーを上書きすることは可能ですか?

Nginx。キャッシュされたオブジェクトのヘッダーを上書きすることは可能ですか?

私のチームはnginxを使用していますキャッシュ問題は、上流のアプリケーションが、上書きしたいヘッダーを送信することです。キャッシュされたオブジェクト内キャッシュ内のキー(またはキーの一部)を検索すると、キャッシュされたオブジェクトに保存されたヘッダーを見ることができます。たとえば、

cd /var/cache/nginx/test
grep -inr part_of_key *
Binary file 6/29/7bcd0cd0aadfd536cdd7183cd8b77296 matches

そうすると

strings 6/29/7bcd0cd0aadfd536cdd7183cd8b77296
# content with keys, cached headers and so on

nginxの設定は(簡略化)

# part of server1
  location / {
    proxy_pass            http://upstream;
    proxy_cache           zone1;
  }

ディレクティブはわかっているのでproxy_hide_header、キャッシュされたオブジェクトのヘッダーを削除 (および置換) しようとしましたが、うまくいきません。プロセスは次のようになります。

  1. 上流が応答を送信する
  2. nginxはレスポンスを読み取ります
  3. 応答はキャッシュ内のファイルに保存されます
  4. レスポンスをクライアントに送信するために、ヘッダーの削除などの操作がレスポンスに対して実行されます。

したがって、これがキャッシュに保存される前に、応答のヘッダーに影響を与える方法はないようです。

私が開発できる回避策の 1 つは、中間に別の nginx サーバーを配置してヘッダーを変更し、それを のキャッシュに保存することですserver1

# part of server1
  location / 
    proxy_pass            http://upstream-modify-headers;
    proxy_set_header      Host modify.headers;
    proxy_cache           zone1;
  }

# the upstream
upstream upstream-modify-headers {
  server 127.0.0.1:80;
}
#the host that modifies the headers
server {
  listen *:80;


  server_name           modify.headers;

      add_header "cache-control" "public, max-age=10, must-revalidate";

  ...

  location / {
    proxy_pass            http://upstream;
    proxy_hide_header     cache-control; #one example header that should be modified in the cache
  }
  ...
  allow 127.0.0.1; #only locally available
}

これは機能しますが、追加の nginx ホストが必要です。代わりに、アップストリームに追加のヘッダーを追加せずに、同じ nginx サーバー内のキャッシュされたオブジェクトのヘッダーをオーバーライドすることは可能ですか?

答え1

指示を探しているようですproxy_hide_header

答え2

回避策として、ヘッダーに日付スタンプを追加してみてください。追加すると、どのヘッダーがキャッシュからのもので、どのヘッダーが新しいかを区別できるようになります(アクセスログで他のタイムスタンプと比較することにより)。

関連情報