1

我需要一些关于 CDN 使用动态查询的反馈。我会知道动态和静态查询之间的最佳选择。

就我而言,我们有一个包含大量静态内容的网页游戏。我们每两周执行一次发布,并在 CDN 上添加一些内容,但我们也会更新其中的一些内容。

我看到三种可能的方式:1)对每个文件使用版本控制(例如:welcome01.jpg、welcome02.jpg)2)对每个文件使用动态查询(例如:welcome.jpg?v=01、welcome.jpg?v=02 ) 3) 使用不带版本控制的命名,并且对于每个已修改的文件,在 CDN 上执行失效(清除)。

对我来说,解决方案 3 是最糟糕的,因为我们无法设置高缓存,我们必须使每个更新的文件无效,已经在 CDN 中。

在解决方案 1 和 2 之间,我认为 1 是最好的,因为当我在我的 orign 服务器上上传我的新静态内容并在 CDN 上执行部署时,我的所有内容都在每个边缘发送。在这种情况下,我可以设置一个高缓存内容值。在解决方案 2 中,我认为性能比解决方案 1 最差,因为当我在源服务器中添加新内容(有一些文件更新)时,只有新文件被发送到边缘。更新的文件仅在客户端使用新参数执行查询时可用(例如:welcome.jpg?v=03)。在这种情况下,边缘服务器将在我的源服务器上下载welcome.jpg 并将他与新参数相关联。但他并没有在所有其他 Edge 中复制。

对我来说,解决方案 2 在性能级别上低于解决方案 1,但是对于它们两者,我们都可以设置一个高缓存内容值。

你能给我你的意见或更多的信息吗?

提前致谢。

PS:我们使用云端,但这是所有 CDN 提供商的普遍问题。

4

1 回答 1

1

并非所有代理缓存或 ISP 都会单独缓存带有查询字符串的资源。换句话说,它们可能不会正确地使您的缓存无效。更多关于这里

因此,如果您想确保新文件存在并下载,我不得不说解决方案 1 更安全。一个新的唯一 URI 将为您提供此信息。对文件进行版本控制可以很好地解决这个问题。

根据 CDN 的工作方式,您可以使用 mod-rewrite 强制下载,而不必手动对文件进行繁琐的版本控制。

例如,如果您的 CDN 可以通过 CNAME 获取您的更改,例如这就是 MaxCDN 的工作方式,您可以执行类似html5boilerplate的操作。

基于文件名的缓存清除

# If you're not using a build process to manage your filename version revving,
# you might want to consider enabling the following directives to route all
# requests such as `/css/style.12345.css` to `/css/style.css`.

# To understand why this is important and a better idea than `*.css?v231`, read:
# http://stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring

<IfModule mod_rewrite.c>
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpg|gif)$ $1.$3 [L]
</IfModule>

基于文件夹的缓存清除

或者,如果您不需要/想要对每个文件进行版本控制,并且必须繁琐地更改所有代码和 css。您拥有整个文件夹版本系统而不是基于文件的系统可能会更好。例如,假设您的物理资源文件位于 /assets/css 和 /assets/img 和 /assets/js 中,您可以使用 mod rewrite 使 /v1.0/assets/* 映射到您的真实文件夹。这样,您可以正常上传新更新的资源,然后在站点配置中增加版本变量,并使所有资源指向新文件夹。这是类似的modrewrite。

<IfModule mod_rewrite.c>
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^/v([0-9\.]+)/assets/(.+)$ /assets/$2 [L,QSA]
</IfModule>
于 2013-07-04T19:10:28.630 回答