我在 Cloudfront 中创建了一个私有发行版以防止盗链。我设法用签名的 URL 创建了指向我的对象的链接,现在工作正常。
我唯一担心的是,我的 css 样式表中的图像链接不起作用,因为它们没有签名。因此,如果我有,例如:
background-image: url('../img/bg.png');
背景图像不会显示,因为样式表不包含签名的 url,因此 Cloudfront 拒绝提供内容。
我能做些什么来防止这种情况发生吗?
我在 Cloudfront 中创建了一个私有发行版以防止盗链。我设法用签名的 URL 创建了指向我的对象的链接,现在工作正常。
我唯一担心的是,我的 css 样式表中的图像链接不起作用,因为它们没有签名。因此,如果我有,例如:
background-image: url('../img/bg.png');
背景图像不会显示,因为样式表不包含签名的 url,因此 Cloudfront 拒绝提供内容。
我能做些什么来防止这种情况发生吗?
让我退后一步,问一个基本问题:你真的担心别人盗用你的图片吗?真的吗?如果有人这样做,它将对您产生什么现实影响?真的吗?
如果您有正当理由阻止人们进行热链接,那么我不确定任何CDN 服务(在本例中为 CloudFront)是否适合您。
嘿,我只是说实话……</p>
有几种方法,每种方法都有缺点。
您可以通过模板(或其他一些将资源映射到 CloudFront 位置的智能方式)生成它,而不是静态 CSS 文件。您可以通过使用 Last-Modified 和 max-age Cache 标头在此处使用某种程度的缓存。最困难的解决方案,但可以说是最好的保护。
为所有 CSS 资源设置重定向路径,基本上是一个重写 CF 路径的小脚本(注意只重写 CSS 资源,别无其他)。这允许您保留当前的静态 CSS,但会打开重定向脚本的潜在热链接。
介于两者之间的东西可能是一个 cron 脚本,它生成带有在 1.5d 中过期的链接的静态 CSS 文件,以减少服务器负载。
为您的 css 文件使用私有分发通常是一个非常糟糕的主意,因为向 css url 添加(可能是不断变化的)到期时间和签名会阻止浏览器缓存它们,因此首先大大降低了使用 Cloudfront 的有用性。
即使您使用较长的过期时间,那么拼命想要热链接您的 css 背景图像的人也会简单地设置一个脚本来抓取您的 css 文件并从那里提取图像 url。
您可以每隔一两天轮换整个 CDN 主机名,然后您不必更改 css 中的任何内容(假设 css 位于示例中的 CDN 上)
http://www.explainthatstuff.com/blocking-cloudfront-hotlinks.html
这样你的 CSS 就不需要签名的 URL,你仍然可以有效地阻止盗链。
我最近才听说将 base64 编码为 html/css。有利有弊,但这可能正是您要寻找的: 将背景图像数据嵌入 CSS 作为 Base64 的好做法还是坏做法?
<base>
在你的 html 中使用标签怎么样?虽然没有尝试,但可能会有所帮助。
另一种选择是使用 php 生成样式表。例如,您获取所有图像的签名 url,然后将它们作为变量推送到样式元素。