หลังจากปรับแต่งบางอย่างฉันดูเหมือนจะทำให้สิ่งนี้ใช้งานได้โดยไม่ต้องแฮ็คสตริงข้อความค้นหา ข้อมูลเพิ่มเติมที่นี่: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorS3Origin.html#RequestS3-cors
ฉันจะดำเนินการตั้งค่าทั้งหมดเพื่อให้ง่ายต่อการดูว่าฉันทำอะไรไปบ้างหวังว่านี่จะช่วยคนอื่นได้
ข้อมูลความเป็นมา: ฉันใช้แอพ Rails ที่มีแอพ asset_sync เพื่อใส่สินทรัพย์ลงใน S3 ซึ่งรวมถึงแบบอักษร
ภายในคอนโซล S3 ฉันคลิกที่ที่เก็บข้อมูลคุณสมบัติและ 'แก้ไขการกำหนดค่า cors' ที่นี่:
ภายใน textarea ฉันมีบางอย่างเช่น:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>https://*.example.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
จากนั้นภายในแผง Cloudfront ( https://console.aws.amazon.com/cloudfront/home ) ฉันสร้างการแจกจ่ายเพิ่ม Origin ที่ชี้ไปที่ที่เก็บข้อมูล S3 ของฉัน
จากนั้นเพิ่มพฤติกรรมสำหรับเส้นทางเริ่มต้นเพื่อชี้ไปที่การตั้งค่าต้นทางที่ใช้ S3 สิ่งที่ฉันทำคือคลิกที่ส่วนหัวที่อนุญาตพิเศษและเพิ่มOrigin
:
สิ่งที่เกิดขึ้นตอนนี้มีดังต่อไปนี้ซึ่งฉันเชื่อว่าถูกต้อง:
1) ตรวจสอบว่าส่วนหัว S3 ได้รับการตั้งค่าอย่างถูกต้อง
curl -i -H "Origin: https://example.com" https://s3.amazonaws.com/xxxxxxxxx/assets/fonts/my-cool-font.ttf
HTTP/1.1 200 OK
x-amz-id-2: Ay63Qb5uR98ag47SRJ91+YALtc4onRu1JUJgMTU98Es/pzQ3ckmuWhzzbTgDTCt+
x-amz-request-id: F1FFE275C0FBE500
Date: Thu, 14 Aug 2014 09:39:40 GMT
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=180
Last-Modified: Mon, 09 Dec 2013 14:29:04 GMT
ETag: "98918ee7f339c7534c34b9f5a448c3e2"
Accept-Ranges: bytes
Content-Type: application/x-font-ttf
Content-Length: 12156
Server: AmazonS3
2) ตรวจสอบว่า Cloudfront ทำงานร่วมกับส่วนหัว
curl -i -H "Origin: https://example.com" https://xxxxx.cloudfront.net/assets/fonts/my-cool-font.ttf
HTTP/1.1 200 OK
Content-Type: application/x-font-ttf
Content-Length: 12156
Connection: keep-alive
Date: Thu, 14 Aug 2014 09:35:26 GMT
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=180
Last-Modified: Mon, 09 Dec 2013 14:29:04 GMT
ETag: "98918ee7f339c7534c34b9f5a448c3e2"
Accept-Ranges: bytes
Server: AmazonS3
Vary: Origin
X-Cache: Miss from cloudfront
Via: 1.1 77bdacfea247b6cbe84dffa61da5a554.cloudfront.net (CloudFront)
X-Amz-Cf-Id: cmCxaUcFf3bT48zpPw0Q-vDDza0nZoWm9-_3qY5pJBhj64iTpkgMlg==
(โปรดทราบว่าข้างต้นเป็นสิ่งที่พลาดจาก cloudfront เนื่องจากไฟล์เหล่านี้ถูกแคชเป็นเวลา 180 วินาที แต่เหมือนกันกำลังทำงานกับ Hit)
3) เข้าสู่ cloudfront ด้วยต้นกำเนิดที่แตกต่างกัน (แต่สิ่งที่ได้รับอนุญาตบน CORS สำหรับที่เก็บ S3) - Access-Control-Allow-Origin
ไม่ได้รับการแคช! เย้!
curl -i -H "Origin: https://www2.example.com" https://xxxxx.cloudfront.net/assets/fonts/my-cool-font.ttf
HTTP/1.1 200 OK
Content-Type: application/x-font-ttf
Content-Length: 12156
Connection: keep-alive
Date: Thu, 14 Aug 2014 10:02:33 GMT
Access-Control-Allow-Origin: https://www2.example.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=180
Last-Modified: Mon, 09 Dec 2013 14:29:04 GMT
ETag: "98918ee7f339c7534c34b9f5a448c3e2"
Accept-Ranges: bytes
Server: AmazonS3
Vary: Origin
X-Cache: Miss from cloudfront
Via: 1.1 ba7014bad8e9bf2ed075d09443dcc4f1.cloudfront.net (CloudFront)
X-Amz-Cf-Id: vy-UccJ094cjdbdT0tcKuil22XYwWdIECdBZ_5hqoTjr0tNH80NQPg==
โปรดทราบว่าโดเมนได้รับการเปลี่ยนแปลงเรียบร้อยแล้วโดยไม่มีการแฮ็กสตริงข้อความค้นหา
เมื่อฉันเปลี่ยนส่วนหัว Origin ดูเหมือนว่าจะมีX-Cache: Miss from cloudfront
คำขอแรกเสมอหลังจากนั้นฉันก็ได้รับสิ่งที่คาดหวังX-Cache: Hit from cloudfront
ป.ล. เป็นที่น่าสังเกตว่าเมื่อทำการ curl -I (ตัวพิมพ์ใหญ่ I) จะไม่แสดงส่วนหัว Access-Control-Allow-Origin เนื่องจากเป็นเพียง HEAD เท่านั้นฉันทำ -i เพื่อทำให้เป็น GET และเลื่อนขึ้น
Access-Control-Allow-Origin
หัวได้รับการเก็บไว้ชั่วคราวและ ธ โมฆะเมื่อมีการร้องขอที่ตามมาจะทำผ่านการย่อยแตกต่างกันอย่างไร