Php Amazon Cloudfront私有分发-指向CSS内图像的链接

Php Amazon Cloudfront私有分发-指向CSS内图像的链接,php,amazon-s3,amazon-web-services,amazon-cloudfront,Php,Amazon S3,Amazon Web Services,Amazon Cloudfront,我在Cloudfront中创建了一个私有发行版以防止热链接。我设法用签名的URL创建指向我的对象的链接,现在运行良好 我唯一担心的是,css样式表中的图像链接无法正常工作,因为它们没有签名。例如,如果我有: background-image: url('../img/bg.png'); 背景图像不会显示,因为样式表不包含签名的url,因此Cloudfront拒绝提供内容 我能做些什么来防止这种情况发生吗?有几种方法,每种方法都有缺点 不是静态CSS文件,而是通过模板生成(或者通过其他智能方式将

我在Cloudfront中创建了一个私有发行版以防止热链接。我设法用签名的URL创建指向我的对象的链接,现在运行良好

我唯一担心的是,css样式表中的图像链接无法正常工作,因为它们没有签名。例如,如果我有:

background-image: url('../img/bg.png');
背景图像不会显示,因为样式表不包含签名的url,因此Cloudfront拒绝提供内容


我能做些什么来防止这种情况发生吗?

有几种方法,每种方法都有缺点

不是静态CSS文件,而是通过模板生成(或者通过其他智能方式将资源映射到CloudFront位置)。在这里,您可以通过使用Last Modified和max age缓存头来使用某种程度的缓存。这是最难的解决方案,但可以说是最好的保护

为所有CSS资源设置一个重定向路径,基本上是一个重写CF路径的小脚本(注意只重写CSS资源而不重写其他内容)。这允许您保持当前的静态CSS,但会打开重定向脚本的潜在热链接


介于两者之间的可能是一个cron脚本,它生成静态CSS文件,其中的链接将在1.5d后过期,以减少服务器负载

您可以每一两天旋转一次整个CDN主机名,然后不必更改css中的任何内容(假设css位于CDN上,如示例所示)

这样你的CSS就不需要有签名的URL,你仍然可以同样有效地阻止热链接。

在html中使用
标记怎么样? 虽然没有尝试,但可能会有所帮助


另一种选择是使用php生成样式表。例如,获取所有图像的签名URL,然后将其作为变量推送到样式元素

让我退一步问一个基本问题:你真的担心人们把你的图片链接起来吗?真正地如果有人这样做了,它会对你产生什么现实影响?真的吗

如果您有正当理由阻止人们进行热链接,那么我不确定任何CDN服务(在本例中为CloudFront)是否适合您


嘿,我只是说实话…

对css文件使用私有发行版通常是一个非常糟糕的主意,因为向css URL添加(可能是不断变化的)过期时间和签名会阻止浏览器缓存它们,因此从一开始就大大降低了使用Cloudfront的有用性


即使你使用了很长的过期时间,如果有人非常想热链接你的css背景图片,那么他只需要设置一个脚本来抓取你的css文件并从中提取图片URL

我最近听说base64编码成html/css。有优点也有缺点,但这可能是你想要的:

这是一个有趣的问题,但我对此表示怀疑。我很惊讶以前没有人遇到过类似的问题,我想在Cloudfront上作为私有发行版托管CSS文件是很常见的(以避免热链接),不是吗?大多数大到需要/想要CDN的站点可能并不太关心热链接。对于任何大型网站来说,这通常都是杯水车薪——特别是当你谈论CSS文件中的内容时。大多数人都不会对布局元素进行热链接。我同意,对布局元素进行热链接是一个非常糟糕的主意,如果你决定移动或删除文件,我的网站将停止工作,我将没有文件副本来修复它。。只需下载并自己托管就更安全了。大的/唯一的图像是我唯一担心的保护是这个
背景图像:文件('../img/bg.png')正确的语法?意思是在CSS中它应该像下面这样
背景图像:url('../img/bg.png')