У меня AWS S3 bucket настроен как статический веб-сайт со следующей конфигурацией 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>
У меня также есть лямбда-функция, которая перенаправляет на конкретную страницу в вышеупомянутой корзине 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);
}
Я могу получить доступ к странице S3 HTML напрямую из браузера, используя тот же URL в коде. Да, домен API отличается от домена S3:
api.domain.com --> initiates the request (redirection)
sub.domain.com/page.html --> requested resource (redirection target)
Сервер отвечает на запрос OPSS предварительной проверки CORS с ошибкой 403, а браузер сообщает следующее сообщение об ошибке:
Доступ к XMLHttpRequest в «Файл S3» (перенаправляется из «Конечной точки API»)
из источника 'null' был заблокирован политикой CORS: Ответ на
предварительный запрос не проходит проверку контроля доступа: нет
Заголовок «Access-Control-Allow-Origin» присутствует в запрошенном
ресурс.
Первоначально я настроил сайт с помощью Serverless Framework, добавив следующие строки в мой serverless.yml:
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}/*"
Как только корзина была создана с помощью Serverless Framework и увидела ошибки CORS, я безуспешно определил политику CORS на S3.
Стоит также отметить, что сайт S3 настроен с CloudFront Distribution, но я не уверен, что это имеет значение.
Это должно быть легко исправить, но это оказывается довольно сложно. Пожалуйста, помогите.