![]() | 1 jarlyyn 2017-02-27 16:07:36 +08:00 一般不都是链接后面加个时间戳吗? |
![]() | 2 jarlyyn 2017-02-27 16:08:04 +08:00 如果是要通知 cdn 清缓存。 应该是调用 api |
![]() | 4 peesefoo OP 并不提供 api |
![]() | 6 batnss 2017-02-27 16:13:25 +08:00 via Android 模拟登入 输入链接 刷 手工版 api |
![]() | 7 oott123 2017-02-27 16:14:52 +08:00 浏览器按 Ctrl+F5 本质上就是发 HTTP 请求 所以你把那个 HTTP 请求抓出来自己用 php 发就好了 |
![]() | 9 peesefoo OP @jarlyyn 目的是通知 cdn ,源站内容已更新,请速来抓取最新内容,替换 cdn 服务器上旧的内容。访客访问到的是缓存在 cdn 上的内容。加时间戳的是不缓存的,失去 cdn 的作用。 |
10 humxman 2017-02-27 16:34:53 +08:00 via Android Ctrl+F5 这个是无缓存重新请求, Curl 按标准 http 请求带上有效登录 cookie 就行。 |
13 yangweijie 2017-02-27 17:00:54 +08:00 location.reload(true) |
![]() | 14 anyforever 2017-02-27 17:11:53 +08:00 你要更新的是整个页面,还是单个图片或者 JS 文件? 整个页面最好走 CDN 的接口通知更新缓存 单个图片或者 JS ,直接在文件名后变换尾巴就好了。 |
![]() | 15 binux 2017-02-27 17:15:08 +08:00 via Android CTRL-F5 怎么可能能刷新 CDN 缓存?难道每个新用户访问都会导致 CDN 重新缓存吗,那要他何用? |
![]() | 16 langmoe 2017-02-27 17:16:05 +08:00 等等, ctrl+F5 能把 cdn 的缓存也刷了?那要是有个用户按着 ctrl+F5 不撒手你家 cdn 的缓存功能不直接失效了 |
![]() | 17 jianzhiyao020 2017-02-27 17:31:57 +08:00 可以用 console ?直接执行脚本 |
![]() | 18 Zzzzzzzzz 2017-02-27 17:35:28 +08:00 ctrl+F5 |
![]() | 19 wenzichel 2017-02-27 17:35:46 +08:00 1. 在你修改完上传到 cdn 后,修改页面中引用该静态资源后面的时间戳,只在你修改文件时才改时间戳 2. 将上传的每个静态资源都进行 hash 命名,然后替换页面中的静态资源路径 |
![]() | 20 Zzzzzzzzz 2017-02-27 17:36:13 +08:00 (自动回了, 接上)清的是本地浏览器缓存, 正规点的 CDN 服务应该有 purge 的 API 吧 |
![]() | 21 xialdj 2017-02-27 17:36:49 +08:00 via iPhone 输入链接提交的时候 把请求抓下来 然后自己模拟这个请求 |
![]() | 22 GoBeyond 2017-02-27 18:16:51 +08:00 via Android 我觉得你的解决思路有问题 你的意思是,前面的 CDN 缓存了后端渲染的 html ? 这样的话我感觉真的思路有问题 页面 html 缓存的实现,按照我的理解,应该在后端进行而不是交给前面的 cdn ,不然肯定一堆麻烦 当页面发生更新之后,通知在后端的缓存逻辑清除缓存,当有新的请求时载入页面至缓存,这样或许比较好吧 我也是新萌,如果哪里说的有问题希望其他大牛不吝赐教 |
![]() | 23 smallpath 2017-02-27 18:21:45 +08:00 缓存资源名中包含 hash (不能是链接后缀形式,必须是文件名中),改了 hash 自己就刷新了。 |
![]() | 24 lhbc 2017-02-27 18:27:17 +08:00 via iPhone CDN 一般会忽略请求头的 no-cache 正确方法是改变 arg |
![]() | 25 zhoushiya 2017-02-27 18:57:54 +08:00 via Android 我觉得楼主的意思是他把静态页存到了 cdn ,然后更新内容了。需要刷新 cdn 的缓存… |
![]() | 26 zhidian 2017-02-27 19:20:32 +08:00 "一个是登录他们的后台,输入链接提交刷新;一个是在浏览器中打开页面,然后按 CTRL + F5 来刷新缓存" 这两个不一样啊……前面那个确实刷新了(延后生效),后面那个……就啥也没干。 |
![]() | 27 peesefoo OP @zhidian 实际上这个 cdn 支持 ctrl +f5 来刷新 cdn 服务器上的缓存 |
![]() | 28 xieranmaya 2017-02-27 23:03:24 +08:00 |
![]() | 29 dangyuluo 2017-02-27 23:11:18 +08:00 我以前的解决办法是,加截取后三位的时间戳, math.round(timestamp/1000)*1000 |
![]() | 30 dangyuluo 2017-02-27 23:14:18 +08:00 你也可以这么做(丧心病狂一点),以野狗为例,每个文章页面都发起一个 websocket 到野狗惟一对应的文档。你在后台更新文档后,用 php sdk 向野狗的该文档发送一个时间戳。然后所有前台浏览中的页面会收到这个 ws 消息,然后用 HTML5 API 刷新带时间戳的页面就可以。因为你有新的时间戳了, CDN 也默认回源。 当其他用户打开这个页面的时候,发现时间戳和最新版本是匹配的,就不用再刷新了。 |
31 lecher 2017-02-27 23:34:50 +08:00 via Android ![]() 这个问题更像是管理缓存机制的策略。 最优策略肯定是利用 CDN 自带的刷新缓存服务去通知各地 CDN 缓存服务器刷新,这才是百分百有效的刷新缓存页面机制。 联系 CDN 服务商,要求开有鉴权主动刷新缓存的 API ,避免验证码这种诡异的请求数量限制。 如果 CDN 节点不支持主动刷新缓存,最好是改缓存策略,只用 CDN 缓存带 hash 标注的静态文件和几乎不会再修改的 HTML 页面。需要更新的 HTML 界面的请求带宽由服务器来抗。只传输 HTML 界面的代码带宽消耗已经很小了,可以通过多开服务器分摊流量负载。至于页面数据解析和请求数据库的负载,可以考虑用 Redis 按 URL 整体打包缓存。 在后台模拟强制刷新网页的请求属于歪门邪道,那样顶天了只能刷新服务器所在地区的缓存。 |