首页 > 解决方案 > 如何在服务器中正确显示我的项目?

问题描述

我将我的项目发送到我的服务器,但没有人看不到我在本地模式下所做的更改(我有 index.html 和其他 js 和 php)。我在另一个带有 index.php 的项目中遇到了同样的问题,但是在脚本末尾添加了这个<?php time();?>问题。javascript有类似的解决方案吗?

这就是我所做的

<script src="assets/js/funciones.js?<?php time();?>"></script>

标签: javascriptphphtml

解决方案


问题是您正在更改静态文件,而不是它们的文件名。

默认情况下,apache/nginx/etc 会提供带有“将其缓存很长时间”的标题的静态内容,因为它是静态内容,为什么不呢?

像您对 JS 所做的那样将随机垃圾添加到 URL 是一种永久破坏所有缓存并确保用户在每次请求页面时重复下载完全相同的静态文件的组合。您可以减少垃圾的随机性以减少破坏缓存的频率,但这仍然是一种低效的组合。[虽然很受欢迎,但让我非常恼火。]

理想情况下,对于像 JS 和 CSS 这样的资源包,每次更改它时都会创建一个新的资源包文件,例如:somefile-v1234.js或者somefile-20211007.js更新 HTML 源代码中的引用。这具有确保资源包的版本始终匹配的附带好处。

任何其他静态文件也是如此:图像、CSV 等。

您现在遇到的问题是您已经更新了一些 HTML 页面,而打破缓存的唯一方法是让用户执行一项操作,例如按 CTRL+F5 强制刷新。

有几种方法可以解决这个问题:

  1. 更改 Apache/Nginx/etc 设置,为静态文件缓存头设置更短的到期时间。您可能能够定位特定文件,例如index.html,但 YMMV.
  2. 使用 PHP 提供内容。默认情况下,通过 PHP 脚本提供的任何内容都不会设置任何缓存标头,因为假设脚本的输出是动态的。您还可以在 PHP 中自己发出缓存标头,以控制缓存的时间。

最后,您无法追溯解决此问题。如果用户拥有尚未到期的 HTML 页面的缓存版本,则用户必须采取措施来破坏该缓存。服务器端没有什么可以做的,因为有效的缓存告诉客户端它不必询问服务器。

一旦你的应用程序流行到足以保证在其前面放置一个 CDN,这个问题就会变得更糟,因为现在中间有一个用户无法控制的缓存,这可能是一个代价高昂的问题因为一些 CDN 提供商会收取强制 CDN 缓存失效的费用。


推荐阅读