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. 응답을 클라이언트에 보내기 위해 헤더 제거와 같은 작업이 응답에 대해 수행됩니다.

따라서 캐시에 저장되기 전에는 응답 헤더에 영향을 미칠 수 있는 방법이 없는 것 같습니다.

내가 개발할 수 있는 해결 방법 중 하나는 다른 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

해결 방법으로 헤더에 날짜 스탬프를 추가해 보세요. 추가하면 캐시에서 가져온 헤더와 새 헤더를 구별할 수 있습니다(액세스 로그를 다른 타임스탬프와 비교하여).

관련 정보