如何强制Nginx重新加载客户端的浏览器以进行内容更改?

时间:2019-08-14 14:46:47

标签: html nginx html5-video browser-cache

我有一个非常简单的设置,但是到目前为止我还无法实现最终目标。我在提供静态html页面的VM上安装了nginx。这个html页面包含我要循环播放的视频的代码。我希望能够替换video目录中的视频文件,并使nginx强制显示旧视频的客户端浏览器重新加载并开始播放新文件,而无需手动重新启动nginx或刷新浏览器。我应该提到客户端浏览器在显示视频的电视上,并且我不想手动刷新电视上的浏览器并自动完成此操作。

通过搜索使它起作用,我发现了一些元标记,但它对我不起作用。该页面提供的是旧视频,一个小时后(我在meta标记中指定的值)一个小时后没有刷新。

<!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强制浏览器重新加载并显示更新的视频。

1 个答案:

答案 0 :(得分:0)

需要检查/记住的几件事:

尽管<meta http-equiv="refresh" content="3600">可以正常工作,但是某些(非常罕见的)浏览器可能不支持它。在这种情况下,您可以尝试添加基于Javascript的解决方案,例如:

<script>
setTimeout(function() { window.location.reload(true); }, 60*60*1000);
</script>

true将确保在重新加载页面时,浏览器将跳过其缓存并从服务器加载页面。

由于您的页面内部使用/链接到相同的视频文件名,因此必须确保http://example.com/videos/main.mp4没有正的缓存头。

您可以使用curl来检查标头,如下所示:

curl -IL http://example.com/videos/main.mp4

查看Cache-ControlExpires的值是什么。您可以同时使用两个标头,也可以同时使用其中任何一个。对于您的情况,它们应规定缓存时间少于一小时或根本没有缓存。

在NGINX中,您可以使用以下方法进行设置:

location = /videos/main.mp4 {
    expires -1;
}

基本上告诉它在获取视频文件(=没有缓存)之后的1秒内发送过期消息。