我将AWS S3存储桶配置为具有以下CORS配置的静态网站:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
我还有一个Lambda函数,可重定向到上述S3存储桶中的特定页面。这是代码的要点:
module.exports.endPoint = (event, context, callback) => {
// Do some cool processing and on success:
redirectToUrl(303, 's3-bucket.amazon.com/page.html', callback);
}
function redirectToUrl(statusCode, url, callback) {
const response = {
statusCode: statusCode,
headers: {
Location: url,
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json'
},
body: '',
};
console.log('Redirecting with status code ' + statusCode + ' to ' + url);
callback(null, response);
}
我可以使用代码中的相同URL从浏览器直接访问S3 HTML页面。是的,API域不同于S3域:
api.domain.com --> initiates the request (redirection)
sub.domain.com/page.html --> requested resource (redirection target)
服务器以403错误响应CORS飞行前选项请求,并且浏览器报告以下错误消息:
访问“ S3文件”中的XMLHttpRequest(从“ API端点”重定向) 来自来源“ null”的邮件已被CORS政策阻止:对 预检请求未通过访问控制检查:否 请求中存在“ Access-Control-Allow-Origin”标头 资源。
我最初通过在Serverless.yml中添加以下几行来使用Serverless Framework设置站点:
SiteBucket:
Type: AWS::S3::Bucket
Properties:
AccessControl: PublicRead
BucketName: ${self:custom.siteName}
WebsiteConfiguration:
IndexDocument: index.html
ErrorDocument: error.html
CorsConfiguration:
CorsRules:
- AllowedMethods:
- GET
- HEAD
AllowedOrigins:
- "*"
MaxAge: 3000
SiteBucketPolicy:
Type: "AWS::S3::BucketPolicy"
DependsOn: "SiteBucket"
Properties:
Bucket: ${self:custom.siteName}
PolicyDocument:
Statement:
- Effect: Allow
Principal: "*"
Action:
- "s3:GetObject"
Resource:
- "arn:aws:s3:::${self:custom.siteName}/*"
一旦通过无服务器框架创建了存储桶并看到了CORS错误,我就在S3上手动建立了CORS策略,但没有成功。
值得注意的是,S3站点是使用CloudFront Distribution设置的,但我不确定这是否有帮助。
这应该很容易解决,但事实证明这相当困难。请帮忙。
答案 0 :(得分:0)
这不是应该包含正确的网址吗?
redirectToUrl(303, 's3-bucket.amazon.com/page.html');
我认为将其更改为以下内容可能会解决您的问题:
redirectToUrl(303, 'https://s3-bucket.amazon.com/page.html');