2013-02-07 67 views
3

我最近在AppFog上部署了我的Node.js博客。我打算在Amazon S3上使用一个存储桶来流式传输我的资源(javascript/stylesheets/images)。使用Express.js从Amazon S3流式传输资产(JS/CSS /图像)

如何确保Express.js获取静态资产到我的Amazon S3存储桶而不是常规的/public

+0

为什么不公开存储桶并直接链接到//s3.amazonaws.com/bucketname/filename.ext上的资产? – josh3736

+0

你是什么意思?我正在使用像/ images/2012 /这样的网址迁移我的旧网站...我无法更改路径。 – jpmonette

+0

我已经添加了一个解释我的意思的答案。为什么你不能改变路径? – josh3736

回答

8

我不会通过节点服务器–流的资产是资源的浪费,而且你将有处理HTTP缓存头。

相反,您的HTML应直接链接到S3存储桶。相反的:

<script src="/js/script.js"></script> 

务必:

<script src="//s3.amazonaws.com/bucket/js/script.js"></script> 

既然你要迁移,只需建立一个永久重定向。

app.get(/^\/(js|css|images)\/.*/, function(req, res) { 
    res.redirect(301, '//s3.amazonaws.com/bucket' + req.path); 
}); 

这会将js,css和images文件夹中的所有请求重定向到S3存储桶。例如,/js/script.js会重定向到//s3.amazonaws.com/bucket/js/script.js。

这将有助于简化转换,但您仍应将网站的引用迁移到S3网址,以消除因重定向而导致的不必要的HTTP往返操作。

+0

所以你不会流的原因是它会浪费S3带宽+我的SaaS带宽,对不对? 此外,这是一个很好的做法,设置每个图像/ js/css那里? – jpmonette

+0

这就是其中一个原因。如果您没有在节点服务器上使用任何缓存机制(这对于正确使用这些缓存机制并不重要),那么对资产的每个请求都将传送到您的服务器,然后您将传送到S3服务器。您支付从S3传输到节点的字节,然后再为节点传输到客户端。另一个重要原因是客户端可用性:您是否准备好处理诸如“ETag”,“I​​f-None-Match”和相关头文件等内容?这些通常由'static'为你处理,而S3也负责处理它们。请记住为S3对象设置“Cache-Control”标头。 – josh3736

+0

谢谢@ josh3736! – jpmonette

相关问题