nginx cache index.html buộc tải lại

Dec 12 2020

Trong quá trình di chuyển máy chủ, cấu hình nginx mới bị thiếu các chỉ thị điều khiển bộ đệm. Do đó, chúng tôi đã kết thúc với một bộ nhớ cache index.htmlrất xấu cho SPA của chúng tôi, nó không được làm mới nữa nếu chúng tôi triển khai mã mới. Chúng tôi cần index.html không được lưu vào bộ nhớ cache.

Đây là cấu hình nginx (xấu) của chúng tôi đã trực tuyến vài ngày:

server {
  listen 80;

  location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
  }

  error_page   500 502 503 504  /50x.html;

  location = /50x.html {
    root   /usr/share/nginx/html;
  }

}

Chúng tôi đã sửa cấu hình của mình:

server {
  listen 80;

  root /usr/share/nginx/html;

  location / {
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
    add_header Cache-Control "no-store, no-cache, must-revalidate";
  }

  location ~* \.(js|jpg|jpeg|gif|png|svg|css)$ {
    add_header Cache-Control "max-age=31536000, public";
  }

  error_page   500 502 503 504  /50x.html;

  location = /50x.html {
    root   /usr/share/nginx/html;
  }

}

CÂU HỎI

Những khách hàng đã truy cập trang web của chúng tôi trong những ngày qua đã lưu vào bộ nhớ cache một index.html cũ. Làm thế nào chúng tôi có thể buộc trình duyệt của họ bỏ bộ nhớ cache của họ index.html?

Trả lời

1 Talkerbox Dec 17 2020 at 16:38

Không có cách nào đặt lại bộ đệm trình duyệt theo cách thủ công ở phía người dùng (trình duyệt) trong khi máy khách không yêu cầu máy chủ cung cấp nội dung mới. Trong trường hợp này, có thể hữu ích khi truy cập vào bất kỳ tập lệnh nào mà SPA của bạn tải xuống mà không có bộ nhớ cache. Trong trường hợp này, bạn có thể thay đổi tập lệnh này và chạy trang buộc tải lại (nhưng hãy cẩn thận - bạn cần có bất kỳ cờ nào để ngăn việc tải lại bắt buộc vĩnh viễn sau mỗi lần tải trang). Ví dụ: nếu bạn có GTM trên trang web - điều này có thể hữu ích.

UPD: Tôi không phải là chuyên gia js, nhưng bạn cần thêm thẻ GTM trên tất cả các trang như js-script này:

function getCookie(name) {
  let matches = document.cookie.match(new RegExp(
    "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
  ));
  return matches ? decodeURIComponent(matches[1]) : undefined;
}

was_reloaded = getCookie('was_reloaded')
alert(was_reloaded)
if (was_reloaded != 'yes') {
        document.cookie = "was_reloaded=yes; path=/; max-age=3600;"
    location.reload();
} }