2015-09-29 5 views
1

Я не могу сделать прямую загрузку (javascript XHR) на своем ведро S3 из-за системы блокировки CORS. Я использую PHP для создания прямой ссылки на загрузку, с политикой загрузки и S3 подписью:Amazon S3 Прямая загрузка: ошибка CORS

{"key": "501/source/${filename}", "AWSAccessKeyId": "AKIAIIG**********", "acl": "private","policy": "ey JleHBpcmF0aW***************", "signature": "j2UnJRfj+uC+FazEF+wPnuJpdcs=", "success_action_status": "201"}

Но когда я пытаюсь загрузить файл в генерируемую ссылку, я получаю следующее сообщение об ошибке от Firefox:

Запрос заблокирован: политика одного и того же происхождения запрещает читать удаленный ресурс по адресу https://my.bucket.s3.amazonaws.com. Это можно исправить , переместив ресурс в тот же домен или включив CORS.

Мой ведро правильно настроен с политикой CORS, чтобы POST отовсюду:

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

Что еще я должен делать?

Вот PHP код я использую для создания политики & S3 подписи:

$key = '42/source/'; 
$policy = json_encode(array(
    'expiration' => date('Y-m-d\TG:i:s\Z', strtotime('+6 hours')), 
    'conditions' => array(
     array('bucket' => 'my.bucket'), 
     array('acl' => 'private'), 
     array('starts-with', '$key', $key), 
     array('success_action_status' => '201') 
    ) 
)); 
$policy = base64_encode($policy); 
$signature = base64_encode(hash_hmac('sha1', $policy, 'G3wzaTNwnQC2mQB3****************', true)); 
return array(
    'key' => $key.'${filename}', 
    'AWSAccessKeyId' => 'AKIAIIG**********', 
    'acl' => 'private', 
    'policy' => $policy, 
    'signature' => $signature, 
    'success_action_status' => '201' 
); 

Я затем использовать этот массив Params в моей JavaScript fileupload() скрипта для прямой загрузки на Amazon S3 (запрос XHR).

Спасибо за вашу помощь, Philippe S.

+0

Если вы запустили 'curl -I https: // my.bucket.s3.amazonaws.com /' или что-то посмотреть в заголовках, получится ли вам ответ, в котором отсутствуют все ожидаемые заголовки 'Access-Control-'? Или это некоторые, но не другие? – sideshowbarker

ответ

0

Если кто-то застрял ... НИКОГДА не используйте точку "" в названии вашего ведра. Это вызывает некоторые проблемы с сертификатом SSL, как новый поддомен.

Например: вы назвали свое ведро «my.bucket», тогда оно будет понято как «мой» субдомен «ведро».

Просто используйте «-» или «_» вместо точки.

Смежные вопросы