【问题标题】:Adding a URL parameter (?p=234) to a file on Amazon Cloudfront doesn't force a refresh of the file [closed]将 URL 参数 (?p=234) 添加到 Amazon Cloudfront 上的文件不会强制刷新文件 [关闭]
【发布时间】:2014-03-20 01:21:45
【问题描述】:

我通过 Amazon Cloudfront 提供 JS 和 CSS 文件。到目前为止,我一直在使用自己的服务器运行 Varnish,当我更新任何 JS 或 CSS 文件或使用新版本时,我必须在请求该文件的 URL 参数上增加一个计数器。

所以被包含的文件的 URL 将从 .../file.css?r=1 变为 .../file.css?r=2 并且 Varnish 会认为这是一个新文件,请求它并缓存它并从那时起从缓存中提供它。

使用 Cloudfront,我意识到它不是那样工作的,它仍然提供旧的缓存文件(并且我不断收到 HTTP 响应上的“来自 Cloudfront 的命中”)。

我是否可以为此更改 Cloudfront 的行为?

我能做的任何其他事情并不意味着每次更新文件时实际上都会更改文件名?我也不想通过 Cloudfront 的 API 使用缓存失效。我认为这对我在这里要做的工作来说太多了,而且我每个月可以提出的(免费)请求数量有限。

【问题讨论】:

  • 在缓存行为设置中使用“查询字符串转发和缓存”。如果您希望 Cloudfront 在每次有查询参数时向源请求新文件,则将该值设置为“全部转发,基于所有缓存”,或者如果您只希望 Cloudfront 获取,则将值设置为“全部转发,基于白名单缓存”新版本取决于查询参数的白名单。

标签: amazon-cloudfront


【解决方案1】:

看起来您提前了一个月左右... 2012 年 5 月中旬,亚马逊宣布您可以开始使用查询字符串来识别云前端缓存中的对象。

这是他们博客上的公告链接:http://aws.typepad.com/aws/2012/05/amazon-cloudfront-support-for-dynamic-content.html

不幸的是,我在我的快速谷歌搜索中没有看到任何描述你如何做到这一点的链接,但我确信它隐藏在他们的文档或控制面板的某个地方。

希望这能让你朝着正确的方向前进。

【讨论】:

  • 我不认为这个功能是为了绕过缓存,而是作为一种从动态内容创建静态缓存的方式。
  • 看到了,正是我想要的:)
【解决方案2】:

不幸的是,如果您想避免重命名文件,通过 CloudFront 的 API 进行失效似乎是目前唯一可用的选项。但是,通过自动化部署过程可以最大程度地减少重命名文件的痛苦。

【讨论】:

  • 您也可以在 URL 中添加参数作为查询路径的一部分,而不是使用此失效。通过一些 URL 重写,这非常有效。
【解决方案3】:

简短的回答,不。 CDN 应该用于不经常更改的静态资产。

来自他们的docs:

当 CloudFront 从源服务器请求对象时,它会删除所有查询字符串参数。

确保您的服务器设置为正确传递 Expires 标头和/或 Cache-Control: max-age 标头。我们目前使用 max-age=1800

【讨论】:

  • 完全不同意这一点。 Web 社区中的许多人使用查询字符串作为“缓存断路器”来绕过需要绕过的资产的缓存版本(例如,您已将过期设置为 30 天的 js 文件中的错误修复) .这同样适用于 css 文件、图像和任何其他您从 cdn 托管的内容。事实上,静态资产确实会发生变化,您需要这种机制来忽略以前缓存在客户端上的任何项目。
  • 你似乎把我说的“不要经常改变”解释为“从不改变”。我可以看到“经常”这个词是如何相当主观的。 Cloudfront 在向源发出请求时会删除查询字符串(默认情况下 - 尽管它们现在支持通过它)。这并不意味着您仍然不能使用它们来破坏浏览器缓存。对于您提到的其他问题,您可以使 cdn 上的对象无效(用于错误修复等),并且应该对经常更改的资产使用版本控制。
  • 是的,您应该使缓存无效,而不是试图绕过它。试图绕过它是一种 hack,而 hack 是,嗯......肮脏和 hackish.. 被网络社区中的许多人皱眉
  • 我明白你的意思,我真的认为我们大多是在说同样的话。按文件名进行版本控制的一个问题是您会用陈旧的文件污染您的项目/文件系统/等。我曾经在一个资产繁重的网站(数亿资产)上工作,您不想将这些文件的版本保留在源代码控制中,尝试从管理员/复制的角度找出哪些是陈旧的,雅达,雅达,雅达。最终,能够灵活地选择最适合您和您的项目的方式才是最重要的。
  • 是的 - 希望我的回复没有读得很苛刻,不是故意的。但同意了。另一方面,我们使用我们的应用程序服务器作为自定义源,因此我们也可以支持 GZIP。我更喜欢人们不能通过查询字符串并强制 CF 在 TTL 过期之前访问我的服务器 - 我不想要额外的负载。各有各的。很高兴他们支持通过查询字符串。现在只要他们支持 S3 上的 GZIP...
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 2010-11-19
  • 1970-01-01
  • 2012-02-18
  • 2011-05-27
  • 2010-11-08
  • 1970-01-01
  • 2014-11-06
相关资源
最近更新 更多