我在node.js中使用express,它以不区分大小写的方式提供静态图像,但当我移动到s3时,我发现图像区分大小写。
在亚马逊s3中有没有办法以不区分大小写的方式提供静态文件(图像)?任何配置?否则,我最好的选择是将图像转换为小写,然后再将它们转换为s3。
另一个问题,c ++。jpg不是由s3渲染的,它需要转换为c%2B%2B.jpg。然而,c ++。jpg通过express呈现为魅力。这里有解决方法吗?
答案 0 :(得分:16)
不,S3上的文件名区分大小写。据推测,这是对底层linux / unix文件系统的限制。
我总是建议人们只上传小写的文件名。
答案 1 :(得分:2)
还应注意,S3意味着由HTTP(S)访问。 HTTP中的URL区分大小写。允许以不区分大小写的方式访问URL的服务器被破坏,因为它们可能污染缓存。文件image.jpg
,Image.jpg
,IMAGE.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将变为小写)