如何强制 nginx 重新加载客户端浏览器以进行内容更改?
How to force nginx to reload client's browser for content change?
我有一个非常简单的设置,但我目前还无法实现最终目标。我在为静态 html 页面提供服务的虚拟机上安装了一个 nginx。此 html 页面包含我要循环播放的视频的代码。我希望能够替换视频目录中的视频文件,并让 nginx 强制显示旧视频的客户端浏览器重新加载并开始播放新文件,而无需重新启动 nginx 或手动刷新浏览器。我应该提到客户端浏览器在显示视频的电视上,我不想手动刷新电视上的浏览器并自动完成此操作。
我通过四处搜索找到了很少的元标记,但它对我不起作用。该页面提供旧视频并且在一小时后不刷新(我在元标记中指定的值)。
<!DOCTYPE html>
<html>
<head>
<title>my video</title>
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">
<meta http-equiv="CACHE-CONTROL" content="NO-CACHE">
<meta http-equiv="refresh" content="3600">
<style>
body {
position: absolute;
overflow: hidden;
width: 100%;
height: 100%;
}
#myvideo {
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<!-- The video -->
<video autoplay muted loop id="myvideo">
<source src="videos/main.mp4" type="video/mp4">
</video>
</body>
</html>
我将不同的视频上传到同名视频目录 "main.mp4" 并希望 nginx 强制浏览器重新加载并显示更新后的视频。
要check/keep记住的几件事:
虽然 <meta http-equiv="refresh" content="3600">
应该可以正常工作,但某些(非常罕见的)浏览器可能不支持它。在这种情况下,您可以尝试添加 Javascript-based 解决方案,例如:
<script>
setTimeout(function() { window.location.reload(true); }, 60*60*1000);
</script>
true
将确保在重新加载页面时,浏览器将跳过其缓存并从服务器加载页面。
由于您的页面 uses/links 在内部使用相同的视频文件名,您必须确保 http://example.com/videos/main.mp4
没有正缓存 headers。
您可以使用 curl
来检查 headers,如下所示:
curl -IL http://example.com/videos/main.mp4
查看 Cache-Control
和 Expires
的值是多少。您可以同时拥有,或其中之一 headers。对于您的情况,他们应该规定不到一小时或 none 的可缓存性。
在 NGINX 中你可以这样设置:
location = /videos/main.mp4 {
expires -1;
}
这基本上告诉它在获取视频文件的时间后 1 秒发送过期时间(= 无缓存)。
另一种选择是使用 Refresh
HTTP header:
location = /chart.auto.png {
alias /run/data/chart.png;
add_header Refresh "5; url=https://example.com/chart.auto.png";
}
这个 header 使浏览器要么刷新这个URL,要么可能在 5 秒后转到另一个 URL。
这适用于任何类型的内容(不仅是 HTML 页),如示例所示。
虽然这可能工作正常,但仍建议为您提供的 object 禁用缓存:
add_header Last-Modified $date_gmt;
add_header Cache-Control 'no-store, no-cache';
if_modified_since off;
expires off;
etag off;
我有一个非常简单的设置,但我目前还无法实现最终目标。我在为静态 html 页面提供服务的虚拟机上安装了一个 nginx。此 html 页面包含我要循环播放的视频的代码。我希望能够替换视频目录中的视频文件,并让 nginx 强制显示旧视频的客户端浏览器重新加载并开始播放新文件,而无需重新启动 nginx 或手动刷新浏览器。我应该提到客户端浏览器在显示视频的电视上,我不想手动刷新电视上的浏览器并自动完成此操作。
我通过四处搜索找到了很少的元标记,但它对我不起作用。该页面提供旧视频并且在一小时后不刷新(我在元标记中指定的值)。
<!DOCTYPE html>
<html>
<head>
<title>my video</title>
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">
<meta http-equiv="CACHE-CONTROL" content="NO-CACHE">
<meta http-equiv="refresh" content="3600">
<style>
body {
position: absolute;
overflow: hidden;
width: 100%;
height: 100%;
}
#myvideo {
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<!-- The video -->
<video autoplay muted loop id="myvideo">
<source src="videos/main.mp4" type="video/mp4">
</video>
</body>
</html>
我将不同的视频上传到同名视频目录 "main.mp4" 并希望 nginx 强制浏览器重新加载并显示更新后的视频。
要check/keep记住的几件事:
虽然 <meta http-equiv="refresh" content="3600">
应该可以正常工作,但某些(非常罕见的)浏览器可能不支持它。在这种情况下,您可以尝试添加 Javascript-based 解决方案,例如:
<script>
setTimeout(function() { window.location.reload(true); }, 60*60*1000);
</script>
true
将确保在重新加载页面时,浏览器将跳过其缓存并从服务器加载页面。
由于您的页面 uses/links 在内部使用相同的视频文件名,您必须确保 http://example.com/videos/main.mp4
没有正缓存 headers。
您可以使用 curl
来检查 headers,如下所示:
curl -IL http://example.com/videos/main.mp4
查看 Cache-Control
和 Expires
的值是多少。您可以同时拥有,或其中之一 headers。对于您的情况,他们应该规定不到一小时或 none 的可缓存性。
在 NGINX 中你可以这样设置:
location = /videos/main.mp4 {
expires -1;
}
这基本上告诉它在获取视频文件的时间后 1 秒发送过期时间(= 无缓存)。
另一种选择是使用 Refresh
HTTP header:
location = /chart.auto.png {
alias /run/data/chart.png;
add_header Refresh "5; url=https://example.com/chart.auto.png";
}
这个 header 使浏览器要么刷新这个URL,要么可能在 5 秒后转到另一个 URL。
这适用于任何类型的内容(不仅是 HTML 页),如示例所示。
虽然这可能工作正常,但仍建议为您提供的 object 禁用缓存:
add_header Last-Modified $date_gmt;
add_header Cache-Control 'no-store, no-cache';
if_modified_since off;
expires off;
etag off;