Назад | Перейти на главную страницу

Cache-control no-cache, но не в дочерних папках в Nginx

Я использую это правило в Nginx

location ~ /app/(?<code>...)/acme/?(?<uri>.*) {
  add_header Cache-Control "max-age=0, no-cache, no-store, must-revalidate";
  proxy_pass http://int-srv/$code/acme/dev/$uri;
}

Это добавляет заголовок Cache-control, который я написал выше при вызовах

/app/abc/acme
/app/abc/acme/assets
/app/abc/acme/assets/js
/app/abc/acme/assets/css
/app/abc/acme/anything

Я хочу, чтобы заголовок Cache-control применялся только к / app / abc / acme, потому что, когда эта конечная точка вызывается, ответ - это содержимое нашего index.html. Я не хочу кэшировать его, и в настоящее время он отлично работает.

Если вы думаете о создании правила с помощью index.html, к сожалению, это не сработает, потому что я не вижу, что мы делаем вызов непосредственно в файл (/app/abc/acme/index.html) в инструменты отладчика Chrome

Так что в основном это то, что я хочу

/app/abc/acme - apply cache-control no-cache,etc header to this location only
/app/abc/acme/assets - don't want cache-control header
/app/abc/acme/assets/js - don't want cache-control header
/app/abc/acme/assets/css - don't want cache-control header
/app/abc/acme/anything - - don't want cache-control header

Если вы думаете, что я делаю что-то плохое, дайте мне знать.

Вы можете использовать два местоположения, одно из которых соответствует более короткому URL-адресу. Например:

location ~ ^/app(?<code>/...)/acme/(?<stuff>.*)$ {
    add_header Cache-Control "max-age=0, no-cache, no-store, must-revalidate";
    rewrite ^ $code/acme/dev/$stuff break;
    proxy_pass http://int-srv;
}
location ~ ^/app(?<code>/...)/acme$ {
    rewrite ^ $code/acme/dev break;
    proxy_pass http://int-srv;
}

Имя переменной $uri уже определен системой, поэтому вам, вероятно, следует использовать другое имя.

Использование компонента URI с proxy_pass Директива внутри регулярного выражения явно работает, но недокументирована. По факту, документация состояния:

Когда местоположение указано с помощью регулярного выражения. В этом случае директива должна быть указана без URI.

Итак, в моем примере используется rewrite ... break вместо.