以不区分大小写的方式从s3访问图像

时间:2012-03-03 11:56:28

标签: amazon-s3 express

我在node.js中使用express,它以不区分大小写的方式提供静态图像,但当我移动到s3时,我发现图像区分大小写。

在亚马逊s3中有没有办法以不区分大小写的方式提供静态文件(图像)?任何配置?否则,我最好的选择是将图像转换为小写,然后再将它们转换为s3。

更新

另一个问题,c ++。jpg不是由s3渲染的,它需要转换为c%2B%2B.jpg。然而,c ++。jpg通过express呈现为魅力。这里有解决方法吗?

4 个答案:

答案 0 :(得分:16)

不,S3上的文件名区分大小写。据推测,这是对底层linux / unix文件系统的限制。

我总是建议人们只上传小写的文件名。

答案 1 :(得分:2)

还应注意,S3意味着由HTTP(S)访问。 HTTP中的URL区分大小写。允许以不区分大小写的方式访问URL的服务器被破坏,因为它们可能污染缓存。文件image.jpgImage.jpgIMAGE.JPG可能都指向同一个文件,但缓存不会知道并多次加载同一文件。对于Web浏览器也是如此。如果您在页面上两次引用同一图像,一次为image.jpg,一次为Image.jpg,则浏览器会将图像加载两次。因此,要求S3应该不区分大小写是没有任何意义的。相反,坚持关于URL和HTTP的RFC说并修复您的网站。

BTW底层对象存储是否在POSIX(Unix,Linux)或Windows上实现与此主题无关​​,它与HTTP和URL规范(RFC)有关。

答案 2 :(得分:1)

每当您将文件上传到S3时,您都在创建一个URL。为确保您的安全,您可能需要评估您正在使用的文件名。 HTTP-URL的RFC-Something规范仅允许以下字符在URL中。

<强>正则表达式

[a-zA-Z0-9_-]+

任何与您可能想要更改的模式不匹配的文件名,以便与URL兼容。 AWS是CasE-Sensitive主要是因为它是一个 Object Store 。持久化对象时。很多时候,写入的对象都使用base64 URL安全编码哈希进行持久化,以便在检索期间为对象创建更可靠的搜索时间。

答案 3 :(得分:0)

AWS现在引入了lambda edge。您可以将域(正在使用的s3的主机名)指向cloudfront,将s3存储桶配置为后端,并将lambda edge函数附加到cloudfront。

选择查看器请求事件以触发lambda函数.lambda中的以下nodejs代码会将cloudfront接收到的所有请求转换为小写形式并将其传递给后端s3存储桶。以下代码对我有用。

exports.handler = (event, context, callback) => {
    // TODO implement

   const request = event.Records[0].cf.request;
   console.log (request)
   request.uri = request.uri.toLowerCase()
   console.log (request.uri)
   callback(null, request)

};

工作流程如下。

Request(mixedcase uri)-> cloudfront->(Lambda函数,它将uri变为小写)-> s3(一旦收到请求,uri将变为小写)