ฉันตีสองสามหน้าใน Google ที่คุณสามารถตั้งค่าส่วนหัวใน S3 สำหรับแต่ละวัตถุ นั่นไม่ใช่วิธีที่มีประสิทธิผลที่จะทำเป็นพิเศษเพราะในกรณีของฉันเรากำลังพูดถึงวัตถุหลายอย่าง
นั่นคือ "ประสิทธิผล" หรือไม่นั่นคือวิธีที่มันถูกออกแบบมาเพื่อใช้งานจริง
CloudFront ไม่เพิ่ม Cache-Control:
ส่วนหัว
CloudFront ผ่านผ่าน (และประการเว้นแต่การกำหนดค่าอื่น ๆ )Cache-Control:
ส่วนหัวให้โดยเซิร์ฟเวอร์ต้นทางซึ่งในกรณีนี้คือ S3
ในการรับCache-Control:
ส่วนหัวที่จัดเตรียมไว้โดย S3 เมื่อดึงวัตถุมาจะต้องจัดเตรียมเมื่ออัปโหลดวัตถุไปยัง S3 หรือเพิ่มลงในข้อมูลเมตาของวัตถุด้วยการดำเนินการวาง + คัดลอกที่ตามมาซึ่งสามารถนำมาใช้เพื่อคัดลอกภายในวัตถุเอง S3, แก้ไขข้อมูลเมตาในกระบวนการ นี่คือสิ่งที่คอนโซลทำอยู่เบื้องหลังหากคุณแก้ไขข้อมูลเมตาของวัตถุ
นอกจากนี้ยังมี (ในกรณีที่คุณสงสัย) ไม่มีการตั้งค่าส่วนกลางใน S3 เพื่อบังคับให้วัตถุทั้งหมดในที่เก็บข้อมูลเพื่อส่งคืนส่วนหัวเหล่านี้ - เป็นแอตทริบิวต์ต่อวัตถุ
Update: Lambda @ Edge เป็นฟีเจอร์ใหม่ใน CloudFrontที่ช่วยให้คุณสามารถเรียกใช้งานการร้องขอและ / หรือการตอบสนองระหว่างผู้ดูและแคชและ / หรือแคชและต้นกำเนิดและการเรียกใช้โค้ดที่เขียนใน Node.js กับโครงสร้างวัตถุคำขอ / ตอบ เปิดเผยโดย CloudFront
หนึ่งในแอปพลิเคชั่นหลักสำหรับคุณสมบัตินี้คือการจัดการส่วนหัว ... ดังนั้นในขณะที่ข้างต้นยังคงมีความถูกต้อง - CloudFront ไม่เพิ่มCache-Control
- ตอนนี้เป็นไปได้ที่ฟังก์ชั่นแลมบ์ดาจะเพิ่มเข้าไปในการตอบสนองที่ส่งคืนจาก CloudFront
ตัวอย่างนี้เพิ่มCache-Control: public, max-age=86400
ต่อเมื่อไม่มีCache-Control
ส่วนหัวที่มีอยู่ในการตอบกลับ
การใช้รหัสนี้ในทริกเกอร์การตอบสนองของแหล่งกำเนิดสินค้าจะทำให้รหัสนั้นเกิดขึ้นทุกครั้งที่ CloudFront เรียกวัตถุจากแหล่งกำเนิดและแก้ไขการตอบสนองก่อนที่ CloudFront จะแคช
'use strict';
exports.handler = (event, context, callback) => {
const response = event.Records[0].cf.response;
if(!response.headers['cache-control'])
{
response.headers['cache-control'] = [{
key: 'Cache-Control',
value: 'public, max-age=86400'
}];
}
callback(null, response);
};
อัปเดต (2018-06-20): เมื่อเร็ว ๆ นี้ฉันส่งคำขอคุณลักษณะไปยังทีม CloudFront เพื่ออนุญาตการกำหนดค่าของส่วนหัวการตอบสนองแบบคงที่กำเนิดเป็นแอตทริบิวต์ดั้งเดิมคล้ายกับวิธีที่สามารถเพิ่มส่วนหัวคำขอแบบคงที่ตอนนี้ ... แต่ด้วย บิดอนุญาตให้แต่ละส่วนหัวได้รับการกำหนดค่าให้เพิ่มตามเงื่อนไข (เฉพาะในกรณีที่ต้นกำเนิดไม่ได้ให้ส่วนหัวนั้นในการตอบสนอง) หรือไม่มีเงื่อนไข (เพิ่มส่วนหัวและเขียนทับส่วนหัวจากต้นกำเนิดจากนั้นถ้ามี)
ด้วยการร้องขอคุณสมบัติคุณมักจะไม่ได้รับการยืนยันว่าพวกเขากำลังพิจารณาที่จะใช้คุณสมบัติใหม่ ... หรือแม้กระทั่งว่าพวกเขาอาจใช้งานมันได้แล้ว ... มันเพิ่งประกาศเมื่อเสร็จสิ้น ดังนั้นฉันจึงไม่รู้ว่าจะนำสิ่งเหล่านี้ไปใช้หรือไม่ มีข้อโต้แย้งที่ต้องทำเนื่องจากความสามารถนี้พร้อมใช้งานผ่านแลมบ์ดาเอดจ์แล้วไม่จำเป็นต้องใช้ฟังก์ชั่นพื้นฐาน ... แต่ข้อโต้แย้งของฉันก็คือฐานฟังก์ชั่นไม่สมบูรณ์คุณสมบัติโดยไม่สามารถ ทำการจัดการส่วนหัวที่เรียบง่ายแบบสแตติกและหากเป็นเหตุผลเดียวที่จำเป็นต้องใช้ทริกเกอร์ดังนั้นการเรียกใช้แลมบ์ดาทริกเกอร์จึงเป็นค่าใช้จ่ายที่ไม่จำเป็นทางการเงินและในเวลาแฝงที่เพิ่มเข้ามา