【问题标题】:cdn dynamic query? or notcdn动态查询?或不
【发布时间】:2014-08-12 07:08:26
【问题描述】:

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

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

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

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

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

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

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

提前致谢。

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

【问题讨论】:

    标签: caching optimization cdn


    【解决方案1】:

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

    因此,如果您想确保新文件存在并已下载,我不得不说解决方案 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>
    

    【讨论】:

    • 感谢 Anthony,非常有趣,尤其是知道查询字符串不会一直被缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2016-10-16
    • 2011-06-13
    • 2017-10-24
    相关资源
    最近更新 更多