Подтвердить что ты не робот

AWS S3 - CORS OPTIONS Предполетный выброс 400 Плохой запрос во время DELETE w/VersionId

Я пытаюсь выполнить запрос deleteObject для маркера удаления с помощью ключа объекта и идентификатора версии идентификатора удаления.

Из-за CORS браузер (Chrome 34.0.1847.11) отправляет запрос предварительной проверки OPTIONS: http://bucket.s3-us-west-2.amazonaws.com/Folder/File.ext?versionId=0123456789

Amazon S3 отвечает с 400 (неудачным запросом) со следующим XML-тегом:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>InvalidArgument</Code>
    <Message>This operation does not accept a version-id.</Message>
    <ArgumentValue>0123456789</ArgumentValue>
    <ArgumentName>versionId</ArgumentName>
    <RequestId>12345</RequestId>
    <HostId>1122334455</HostId>
</Error>

Так как XMLHttpRequest возвращает 400 (Bad Request), запрос DELETE никогда не будет выполнен. У меня создается впечатление, что AWS неправильно обрабатывает запрос параметров. Если будет обходной путь, это будет здорово!

Текущая политика CORS на ведре:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>HEAD</AllowedMethod>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

FYI: Я использую AWS SDK для JS 2.0.0-rc10

Спасибо заранее.

РЕДАКТИРОВАТЬ 1: Я попытался добавить <AllowedMethod>OPTIONS</AllowedMethod>, но Amazon возвращает Found unsupported HTTP method in CORS config. Unsupported method is OPTIONS

РЕДАКТИРОВАТЬ 2:

Команды запроса/ответа OPTIONS:

Remote Address: *********:443
Request URL: https://bucket.s3-us-west-2.amazonaws.com/path/to/file_name?versionId=0123456789
Request Method: OPTIONS
Status Code: 400 Bad Request

Request Headers
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Access-Control-Request-Headers: x-amz-user-agent, x-amz-security-token, x-amz-date, authorization, content-type
Access-Control-Request-Method: DELETE
Cache-Control: no-cache
Connection: keep-alive
DNT: 1
Host: bucket.s3-us-west-2.amazonaws.com
Origin: https://website.com
Pragma: no-cache
Referer: https://website.com/
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.60 Safari/537.36
Query String Parameters
versionId: 0123456789

Response Headers
Access-Control-Allow-Headers: x-amz-user-agent, x-amz-security-token, x-amz-date, authorization, content-type
Access-Control-Allow-Methods: HEAD, GET, PUT, POST, DELETE
Access-Control-Allow-Origin: *
Connection: close
Content-Type: application/xml
Date: Tue, 18 Mar 2014 23:59:15 GMT
Server: AmazonS3
Transfer-Encoding: chunked
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-id-2: *************************
x-amz-request-id: ***********

Запрос на удаление никогда не происходит, потому что OPTIONS не работает.

4b9b3361

Ответ 1

Я столкнулся с этой проблемой. Это происходит только в Chrome. Это было потрясающе.

Решение состоит в том, чтобы добавить следующее к вашей соответствующей конфигурации <CORSRule> в AWS:

<AllowedHeader>*</AllowedHeader>

Это заставляет Chrome НЕ отправлять запрос OPTIONS, и все должно работать должным образом.

Ответ 2

Привет, я добавил ту же проблему раньше, когда пытался загрузить изображение в корзину Amazon S3.

Я исправил эту проблему, установив режим "no-cors" и адаптировав мою политику S3 Bucket.

Например

function uploadPhoto (picture) {const config = {bucketName: "BucketName", регион: "eu-west-1", accessKeyId: aws.accessKeyId, secretAccessKey: aws.secretAccessKey, mode: "no-cors" }; ReactS3.uploadFile (картинка, конфиг)}