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

Файлы CSS и JS не обновляются, предположительно из-за кеширования Nginx

У меня есть веб-приложение, работающее с AppCache, и я хотел бы, чтобы при изменении файлов html / css / js, а затем обновлении манифеста кеша, когда пользователь обращается к моему веб-приложению, у них будет обновленная версия этих файлов. Если я изменяю файл HTML, он работает отлично, но когда я меняю файлы CSS и JS, старая версия по-прежнему используется.

Я все проверял и думаю, что это связано с моей конфигурацией nginx. У меня есть файл cache.conf, содержащий следующее:

gzip on;
gzip_types text/css application/x-javascript text/x-component text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;
location ~ \.(css|js|htc)$ {
expires 31536000s;
add_header Pragma "public";
add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
}
location ~ \.(html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml)$ {
expires 3600s;
add_header Pragma "public";
add_header Cache-Control "max-age=3600, public, must-revalidate, proxy-revalidate";
}

И в default.conf у меня есть мои локации. Я хотел бы, чтобы это кеширование работало во всех местах, кроме одного, как я могу это настроить? Я пробовал следующее, и это не работает:

location /dir1/dir2/ {
  root /var/www/dir1;
  add_header Pragma "no-cache";
  add_header Cache-Control "private";
  expires off;
}

Спасибо

Обновить:

Мой cache.conf теперь выглядит так:

location ^~ /desk/ {
  add_header Pragma "no-cache";
  add_header Cache-Control "private";
  expires off;
}

location ^~ /dev/desk/ {
  add_header Pragma "no-cache";
  add_header Cache-Control "private";
  expires off;
}

gzip on;
gzip_types text/css application/x-javascript text/x-component text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;
location ~ \.(css|js|htc)$ {
expires 31536000s;
add_header Pragma "public";
add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
}

Расположение в nginx определяет эксклюзивные конфигурации, то есть с двумя местоположениями

location /dir1/dir2/ {
    # configuration A
}

location ~ \.(css|js|htc)$ {
    # configuration B
}

для запроса будет использоваться только одна конфигурация. С указанными выше местоположениями (как в вашей конфигурации) для запроса на /dir1/dir2/file.css будет выбран location ~ \.(css|js|htc)$ согласно правила выбора места.

Если вы хотите, чтобы nginx не искал местоположения, заданные регулярными выражениями, если запрос начинается с /dir1/dir2/, используйте ^~ модификатор:

location ^~ /dir1/dir2/ {
    # configuration A
}

location ~ \.(css|js|htc)$ {
    # configuration B
}

Таким образом, location ^~ /dir1/dir2/ место будет использоваться для /dir1/dir2/file.css запрос.

В качестве альтернативы вы можете изолировать свои местоположения регулярных выражений под другим местоположением префикса, например location /, как это:

location / {
    # configuration for normal files under /

    location ~ \.(css|js|htc)$ {
        # configuration for css/js/htc files under /
    }
}

location /dir1/dir2/ {
    # configuration for all files under /dir1/dir2/
}

Видеть http://nginx.org/r/location для получения дополнительной информации. В Как nginx обрабатывает запрос статья тоже может быть полезной.