Подтвердить что ты не робот

Отключить кэширование одного файла с помощью директивы try_files

Я обслуживаю приложение Angular 2 с nginx, используя этот раздел таким образом:

location / {
  try_files $uri $uri/ /index.html =404;
}

try_files directive пытается найти запрошенный uri в корневом каталоге, и если он не находит его, он просто возвращает index.html

Как отключить кеширование файла index.html?

4b9b3361

Ответ 1

Нашел решение, используя nginx по имени местоположения:

location / {
    gzip_static on;
    try_files $uri @index;
}

location @index {
    add_header Cache-Control no-cache;
    expires 0;
    try_files /index.html =404;
}

Ответ 2

location / {
  try_files $uri $uri/ /index.html;
}

location = /index.html {
  expires -1;
}

Ответ 3

Спасибо за отличный ответ Рем! Как подчеркивает Хе Шиминг в принятом решении, заголовки кэширования не добавляются при посещении корня, например, www.example.com/, но добавляются при посещении любой глубокой ссылки, например, www.example.com/some/path.

После многих копаний я считаю, что это из-за поведения по умолчанию модуля ngnix ngx_http_index_module, по умолчанию он включает index.html, поэтому при посещении корня/выполняются первые правила блока местоположения, и index.html обслуживается без заголовки управления кешем. Обходной путь, который я использовал, состоял в том, чтобы включить директиву index без указания index.html в первом блоке местоположения, заставляя корень/обслуживаться из второго блока местоположения.

У меня также была другая проблема, я включил корневую директиву в первый блок локации, который нарушал глубокие ссылки, и это тоже плохая идея. Я перенес корневую директиву на уровень сервера.

Надеюсь, это поможет, это мое решение...

server {
  listen       80;
  server_name  localhost;
  root   /usr/share/nginx/html;

  location / {
    add_header X-debug-whats-going-on 1;
    index do-not-use-me.html;
    try_files $uri @index;                 
  }

  location @index {
    add_header X-debug-whats-going-on 2;
    add_header Cache-Control no-cache;
    expires 0;
    try_files /index.html =404;
  }
}

Я включил заголовки отладки, чтобы было абсолютно ясно, какой блок местоположения обслуживает какой контент. Стоит также отметить неинтуитивное поведение директивы add_header, которое необходимо прочитать, если вы также намереваетесь добавить заголовки ко всем запросам вне блока местоположения.

Ответ 4

Я получил следующую настройку для моих приложений Angular, включающую изменения в index.html и конфигурации nginx:

index.html

<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />

nginx.conf

location / {
  try_files $uri $uri/ /index.html;
}

location ~ \.html$ {
  add_header Cache-Control "private, no-cache, no-store, must-revalidate";
  add_header Expires "Sat, 01 Jan 2000 00:00:00 GMT";
  add_header Pragma no-cache;
}

Работает, когда пользователь переходит на "site.com" и "site.com/some/url" или "site.com/#/login". Изменения "index.html" должны быть в основном безопасными.

Ответ 5

Вы можете использовать отображение типа контента (следует выполнить работу для SPA с одним файлом .html):

map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch; # means no-cache
}

server {
  expires $expires;
}


Ответ 6

Просто чтобы быть в безопасности:)

location = /index.html {
    add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
    expires off;
}