如何强制 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-ControlExpires 的值是多少。您可以同时拥有,或其中之一 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;