Я пытаюсь настроить CloudFront через S3 и столкнулся со следующей проблемой.
Я запрашиваю изображения и текстовые файлы из разных доменов. Иногда запросы к файлам делаются с помощью XHR, а иногда и путем встраивания тегов изображений.
Проблема, которую я вижу, заключается в том, что если запрос делается к активу через XHR, он включает заголовок «Origin
», а ответ имеет правильный «Access-Control-Allow-Origin
». И если после этого я запрошу тот же актив, не включая заголовок «Origin
», он правильно ответит без заголовка «Access-Control-Allow-Origin
». НО... если я сделаю другой запрос через XHR, включая заголовок 'Origin
' на тот же URL, он вернет неправильный ответ БЕЗ 'Access-Control-Allow-Origin
' и так далее.
У меня настроен CloudFront с заголовками «Origin
» из белого списка и без кэширования OPTIONS
.
Моя политика 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>
<MaxAgeSeconds>60</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
А вот пример cURL:
Отправить запрос через XHR
~$ curl 'http://xxxxxxxx.cloudfront.net/test/test_03.txt' -H 'Origin: http://www.cnn.com' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-GB,en;q=0.8,en-US;q=0.6,en-NZ;q=0.4,zh-TW;q=0.2,zh;q=0.2,en-AU;q=0.2' -H 'User-Agent: Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53' -H 'Accept: */*' -H 'Referer: http://www.cnn.com/' -H 'Proxy-Connection: keep-alive' --compressed
HTTP/1.1 200 OK
Content-Type: text/plain
Date: Sat, 22 Aug 2015 08:42:56 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 60
Last-Modified: Sat, 22 Aug 2015 08:41:08 GMT
ETag: "0cbc6611f5540bd0809a388dc95a615b"
Accept-Ranges: bytes
Server: AmazonS3
Vary: Origin
X-Cache: Miss from cloudfront
Via: 1.1 8d45ffe3c8bfd31eef4b048ab3ea99b2.cloudfront.net (CloudFront)
X-Amz-Cf-Id: lY4reBVHrFq3MVgdFLx4LvbaOj8UnypXIHxBRvUN4TkkXzyHVmQcmQ==
Content-Length: 4
Connection: Keep-Alive
Повторите запрос (обратите внимание на попадание в кеш)
~$ curl 'http://xxxxxxxx.cloudfront.net/test/test_03.txt' -H 'Origin: http://www.cnn.com' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-GB,en;q=0.8,en-US;q=0.6,en-NZ;q=0.4,zh-TW;q=0.2,zh;q=0.2,en-AU;q=0.2' -H 'User-Agent: Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53' -H 'Accept: */*' -H 'Referer: http://www.cnn.com/' -H 'Proxy-Connection: keep-alive' --compressed
HTTP/1.1 200 OK
Content-Type: text/plain
Date: Sat, 22 Aug 2015 08:42:56 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 60
Last-Modified: Sat, 22 Aug 2015 08:41:08 GMT
ETag: "0cbc6611f5540bd0809a388dc95a615b"
Accept-Ranges: bytes
Server: AmazonS3
Age: 6
Vary: Origin
X-Cache: Hit from cloudfront
Via: 1.1 90d8e168b0948a3eb36a451ebb27f4f9.cloudfront.net (CloudFront)
X-Amz-Cf-Id: cU-TCt-_5MsdLUrUqQk7_HLCUVyNEWOWW2ET19--Pc6j4M-8LkfsyQ==
Content-Length: 4
Connection: Keep-Alive
Отправить запрос БЕЗ заголовка Origin
~$ curl 'http://xxxxxxxx.cloudfront.net/test/test_03.txt' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-GB,en;q=0.8,en-US;q=0.6,en-NZ;q=0.4,zh-TW;q=0.2,zh;q=0.2,en-AU;q=0.2' -H 'User-Agent: Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53' -H 'Accept: */*' -H 'Referer: http://www.cnn.com/' -H 'Proxy-Connection: keep-alive' --compressed
HTTP/1.1 200 OK
Content-Type: text/plain
Date: Sat, 22 Aug 2015 08:43:18 GMT
Last-Modified: Sat, 22 Aug 2015 08:41:08 GMT
ETag: "0cbc6611f5540bd0809a388dc95a615b"
Accept-Ranges: bytes
Server: AmazonS3
X-Cache: Miss from cloudfront
Via: 1.1 bd9375a232718e4567ed228bf8c06fc9.cloudfront.net (CloudFront)
X-Amz-Cf-Id: 03bYSXai6AmwmPRHukm3g8Qv09qB-KdyYs5sXb5RLtPuPdYQHD35hA==
Content-Length: 4
Connection: Keep-Alive
Age: 0
Повторить запрос БЕЗ заголовка Origin
~$ curl 'http://xxxxxxxx.cloudfront.net/test/test_03.txt' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-GB,en;q=0.8,en-US;q=0.6,en-NZ;q=0.4,zh-TW;q=0.2,zh;q=0.2,en-AU;q=0.2' -H 'User-Agent: Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53' -H 'Accept: */*' -H 'Referer: http://www.cnn.com/' -H 'Proxy-Connection: keep-alive' --compressed
HTTP/1.1 200 OK
Content-Type: text/plain
Date: Sat, 22 Aug 2015 08:43:18 GMT
Last-Modified: Sat, 22 Aug 2015 08:41:08 GMT
ETag: "0cbc6611f5540bd0809a388dc95a615b"
Accept-Ranges: bytes
Server: AmazonS3
X-Cache: Miss from cloudfront
Via: 1.1 bd9375a232718e4567ed228bf8c06fc9.cloudfront.net (CloudFront)
X-Amz-Cf-Id: 03bYSXai6AmwmPRHukm3g8Qv09qB-KdyYs5sXb5RLtPuPdYQHD35hA==
Content-Length: 4
Connection: Keep-Alive
Age: 3
Сделайте запрос с заголовком Origin
. Обратите внимание на отсутствие Access-Control-Allow-Origin
~$ curl 'http://xxxxxxxx.cloudfront.net/test/test_03.txt' -H 'Origin: http://www.cnn.com' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-GB,en;q=0.8,en-US;q=0.6,en-NZ;q=0.4,zh-TW;q=0.2,zh;q=0.2,en-AU;q=0.2' -H 'User-Agent: Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53' -H 'Accept: */*' -H 'Referer: http://www.cnn.com/' -H 'Proxy-Connection: keep-alive' --compressed
HTTP/1.1 200 OK
Content-Type: text/plain
Date: Sat, 22 Aug 2015 08:43:18 GMT
Last-Modified: Sat, 22 Aug 2015 08:41:08 GMT
ETag: "0cbc6611f5540bd0809a388dc95a615b"
Accept-Ranges: bytes
Server: AmazonS3
X-Cache: Miss from cloudfront
Via: 1.1 bd9375a232718e4567ed228bf8c06fc9.cloudfront.net (CloudFront)
X-Amz-Cf-Id: 03bYSXai6AmwmPRHukm3g8Qv09qB-KdyYs5sXb5RLtPuPdYQHD35hA==
Content-Length: 4
Connection: Keep-Alive
Age: 9
Тот же запрос С заголовком Origin
. Обратите внимание на отсутствующие Access-Control-Allow-Origin
и Cache-miss
~$ curl 'http://xxxxxxxx.cloudfront.net/test/test_03.txt' -H 'Origin: http://www.cnn.com' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-GB,en;q=0.8,en-US;q=0.6,en-NZ;q=0.4,zh-TW;q=0.2,zh;q=0.2,en-AU;q=0.2' -H 'User-Agent: Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53' -H 'Accept: */*' -H 'Referer: http://www.cnn.com/' -H 'Proxy-Connection: keep-alive' --compressed
HTTP/1.1 200 OK
Content-Type: text/plain
Date: Sat, 22 Aug 2015 08:43:18 GMT
Last-Modified: Sat, 22 Aug 2015 08:41:08 GMT
ETag: "0cbc6611f5540bd0809a388dc95a615b"
Accept-Ranges: bytes
Server: AmazonS3
X-Cache: Miss from cloudfront
Via: 1.1 bd9375a232718e4567ed228bf8c06fc9.cloudfront.net (CloudFront)
X-Amz-Cf-Id: 03bYSXai6AmwmPRHukm3g8Qv09qB-KdyYs5sXb5RLtPuPdYQHD35hA==
Content-Length: 4
Connection: Keep-Alive
Age: 14
X-Cache: Miss from cloudfront
(в Cloudfront не было копии запрошенного объекта в кеше) ... иAge: 14
(эта копия запрошенного объекта в кеше 14 секунд.) Подозреваю мартышки со стороны вашей сети или провайдера. Как будто между вами и Cloudfront встроен плохо работающий (в основном) прозрачный кеш. - person Michael - sqlbot   schedule 23.08.2015X-Amz-Cf-Id
в нескольких разных ответах. Если вы не изменили ни один из этих заголовков, значит, здесь что-то очень серьезно не так, и я склонен не думать, что это Cloudfront или S3. Посмотрите, сможете ли вы продублировать это с помощью HTTPS, так как он менее подвержен такому вмешательству. - person Michael - sqlbot   schedule 23.08.2015