内容分发

内容文件的分发保障

曾经我在知乎上问过这么个问题 为什么很多网站的内容储存用别的域名?有什么好处? 答案里不少提到做 CDN 和 cookieless, 果然这些事在做大了后总会碰到一些, 小记一下我们在这方面走的路, 以及坑爹之处如何绕过

问题主要是怎么靠谱的分发内容文件 (我的叫法, 就是算成 content 的那些, 比如 .js .css 什么的, 以及图片)

首先是怎么保证客户浏览器里不要把我们已更新过的内容文件还读本地缓存里的老版本, 这个还比较简单, 在 html 等引用这些文件的地方加一个无实际用途的参数, 一般选版本号或时间戳, 这样有更新后, 浏览器看到的引用链接参数变了, 就不再读缓存而是去服务器取

然后伞破觉得我们的内容文件都走聚石塔 (淘宝开放平台版的阿里云) 太吃带宽, 而且阿里云的带宽又一点也不便宜, 想办法把这一堆给弄到了七牛上做 CDN 分发, 算是把自己服务器的带宽压力给降了下来

但是国内各色小运营商花样作死总会中枪, 春节期间江西移动自己做了个坑爹缓存, 取七牛上的文件完全搞错了, 客户又过来闹怎么不能用啊, 没办法过年期间平安最重要, 反正用户量不大, 带宽没压力就先切回了自己服务器

期间还碰到搜狗浏览器自己的那个极速模式也有坑爹缓存, 也可能取错, 这时候只能在客户过来反馈为什么用不了的时候让用户从极速模式切换到兼容模式, 这种间歇性抽风完全没法防

年后想着还是要把七牛那个利用起来, 如果用户取不到再降级到自己服务器, 于是在用户 session 里加了个参数用来标记用户取七牛文件是否正常, 默认为真, 用这个值来填充页面模板返回不同的内容文件地址. 然后在页面上写了留了个切换 session 的链接, 再在 css 里把这个元素设定为 display: none, 这样如果取 css 正常, 那前面说的那个切换链接和相关说明文字不可见, 对用户也没影响, 要取不到页面显示就乱掉但是那个提示会很明显, 用户点一下就在 session 里切换过来

本来这样应该就完了, 结果 360 这个奇葩在自己浏览器里不知道怎么想的把我们部属在七牛上的一个 lib.min.js 给判成有风险脚本不给加载, 这样客户那边有不少操作没法响应, 但是 .css 是能取到的又不会提示切换, 最后想了个更猥琐的办法, 在 .js 里都加了个没意义的空函数, 然后在首页写一段页内 js 来检测那个空函数是否存在, 如果不存在说明没加载到也还是有问题, 提示客户跳

其实提示客户跳还可以变成自动帮客户跳, 但是奇葩 IE8 (更低版本 IE 我们直接不支持了) 和用 IE 内核的比如搜狗浏览器执行 js 总是会跟正常浏览器不一样, 可能会死循环 (当然也可能是我们代码写挫了), 然后客户那边就不停的自动刷刷刷, 这事最后反正还是搞定了, 不过具体怎么搞定的我也没去跟进了解前端的事…

这样安心过了大半个月, 突然又有客户过来说你们怎么又打不开, 让对面截图发现是 avast 认为页面里有脚本无限循环直接阻止访问页面访问, 这个… 我们好歹也换参数了这个不算死循环吧, 但是还是没办法, 只能让用户关掉这些水土不服自以为是的安全软件

故事到这里暂时没有更坑爹的事情出现, 记录下来看能不能帮到后来人