วิธีที่ดีที่สุดในการ URL CSS และ JS รุ่นคืออะไร?


26

ตามแนวทางปฏิบัติที่ดีที่สุดของ Yahoo สำหรับการเร่งความเร็วเว็บไซต์ของคุณเราให้บริการเนื้อหาแบบคงที่จาก CDN โดยใช้ส่วนหัวการหมดอายุแคชในอนาคตอันไกล แน่นอนว่าเราจำเป็นต้องอัปเดตไฟล์ "คงที่" เหล่านี้เป็นครั้งคราวดังนั้นเราจึงเพิ่มเวอร์ชัน infix เป็นส่วนหนึ่งของชื่อไฟล์ (ขึ้นอยู่กับผลรวม SHA1 ของเนื้อหาไฟล์) ดังนั้น:

styles.min.css

กลายเป็น:

styles.min.abcd1234.css

อย่างไรก็ตามการจัดการไฟล์ที่มีเวอร์ชันอาจน่าเบื่อและฉันสงสัยว่าสัญกรณ์ GET อาจสะอาดและดีกว่า:

styles.min.css?v=abcd1234

คุณใช้อันไหนและเพราะอะไร มีข้อควรพิจารณาเกี่ยวกับเบราว์เซอร์หรือพร็อกซี / แคชที่ฉันควรพิจารณาหรือไม่


เหตุผลที่ฉันถามคือฉันดูเหมือนจะจำการได้ยินเหตุผลที่จะไม่ใช้รูปแบบการโต้แย้งได้ แต่ฉันจำไม่ได้ว่าทำไม
David Eyk

การใช้อาร์กิวเมนต์ GET ไม่ต้องการการแสดงสไตล์ชีทด้วยสคริปต์ฝั่งเซิร์ฟเวอร์บางชนิด (และจะไม่คงที่อีกต่อไป)
Lotus Notes

@Lotus: คุณสามารถส่งข้อโต้แย้ง GET และพวกเขาจะถูกละเว้นอย่างเงียบ ๆ หากไม่มีสิ่งใดที่มองหาพวกเขา
David Eyk

คำตอบ:


10

ตามการสร้างเว็บได้เร็วขึ้นของ Google หน้าเว็บที่มีพารามิเตอร์การสืบค้นจะไม่ถูกแคชโดยพร็อกซี HTTP จำนวนมาก

พร็อกซีส่วนใหญ่โดยเฉพาะอย่างยิ่ง Squid up ถึงเวอร์ชัน 3.0 ห้ามแคชทรัพยากรด้วย "?" ใน URL แม้ว่าCache-control: publicส่วนหัวจะมีอยู่ในการตอบกลับ หากต้องการเปิดใช้งานการแคชพร็อกซีสำหรับทรัพยากรเหล่านี้ให้ลบสตริงการสืบค้นออกจากการอ้างอิงไปยังทรัพยากรแบบคงที่และเข้ารหัสพารามิเตอร์ลงในชื่อไฟล์ด้วยตนเอง

ดังนั้นstyles.min.abcd1234.cssทางออกที่ต้องการคือ คุณสามารถใช้กลไกการเขียน URL ที่เหมาะสมเพื่อเปลี่ยนstyles.min.abcd1234.cssให้ง่ายต่อการใช้งานstyles.min.css?v=abcd1234อย่างโปร่งใส

หากคุณสนับสนุน HTTPS เท่านั้นคำแนะนำนั้นจะไม่สามารถใช้งานได้เนื่องจากพร็อกซีไม่สามารถแคชหน้าเว็บที่แสดงผ่าน SSL ได้


2
ฉันสงสัยว่าข้อมูลเกี่ยวกับการแคชสตริงการสืบค้นและพร็อกซีเซิร์ฟเวอร์เป็นบิตหรือไม่ เอกสารของ Google ไม่ได้อ้างอิงสตริงการสืบค้นและพร็อกซีเซิร์ฟเวอร์อีกต่อไปในบริบทนี้ แม้ว่าตัวอย่างจะยังคงเกี่ยวข้องกับการเปลี่ยนชื่อไฟล์เอง รายงาน Squid 2.7 (2008) และ 3.1 (2010)สนับสนุนการแคชสตริงข้อความค้นหาตามค่าเริ่มต้นและเวอร์ชันก่อนหน้านี้สามารถกำหนดค่าให้รองรับสิ่งนี้ได้
MrWhite

15

การใช้การกำหนดเวอร์ชันสไตล์ GET จากแคชเปล่าหลาย URL เช่น- style.css?v=123และstyle.css?v=456- จะส่งคืนเนื้อหาเดียวกัน อย่างไรก็ตามฉันไม่เห็นว่าสิ่งนี้จะเป็นปัญหาโดยเฉพาะอย่างยิ่งเนื่องจากคุณจะเชื่อมโยงไปยังทีละครั้งเท่านั้น

ฉันคิดว่าคุณจะพบสไตล์ GET ที่ง่ายต่อการดูแลรักษา คุณไม่ต้องการไฟล์แยก: เพียงแค่เปลี่ยน URL และเบราว์เซอร์จะดึง CSS อีกครั้ง

UPDATE: จากการวิจัยเพิ่มเติมพบว่าการใช้สตริงการสืบค้นอาจหยุดเบราว์เซอร์แคชไฟล์ อย่างไรก็ตามหากคุณส่งคืนส่วนหัวที่เหมาะสมเช่นExpiresนี้ไม่ใช่ปัญหา

UPDATE 2: คำตอบที่ยอมรับชี้ให้เห็นว่าพร็อกซีบางตัวไม่แคชไฟล์ด้วยสตริงการสืบค้น อย่างไรก็ตามสิ่งนี้ขึ้นอยู่กับข้อมูลเก่า ปัญหาที่พวกเขาพูดถึงใน Squid ได้รับการแก้ไขเมื่อ 7 ปีที่แล้ว เว็บที่น่าประทับใจเขียนบทความนี้ได้ดี


นั่นเป็นข้อแม้ที่ฉันพยายามจะจำ ขอบคุณสำหรับลิงค์
David Eyk

1

ทั้งสองจะทำงานได้ดีพอ ๆ กับสตริงข้อความค้นหาซึ่งถือว่าเป็นส่วนหนึ่งของ URL และด้วยการเปลี่ยนแปลงคุณจะมีผลในการเปลี่ยนชื่อของทรัพยากรซึ่งทำให้เบราว์เซอร์สามารถดึงสำเนาไฟล์ใหม่ได้

ฉันว่าใช้วิธีใดก็ตามที่ง่ายต่อการบำรุงรักษา


0

นี่ไม่ใช่คำตอบของคำถามข้างต้นฉันต้องการทางออกที่ดีกว่าดังนั้นฉันจึงถามตัวเองที่นี่

ทั้งสองวิธีนี้ต้องการการแก้ไขไฟล์ที่มีการอ้างอิงไฟล์ css และ js ดังนั้นจะต้องมีการรีสตาร์ทแอปพลิเคชันเซิร์ฟเวอร์หลังจากทำการเปลี่ยนแปลง

มีวิธีที่ดีกว่านี้ซึ่งการจัดการเวอร์ชันของไฟล์สแตติกสามารถจัดการได้โดยไม่ต้องรีสตาร์ทเซิร์ฟเวอร์แอปพลิเคชัน?

สิ่งต่อไปนี้ถูกตัดออกในโซลูชัน

  • การเปลี่ยนชื่อไฟล์ css และ js
  • ผ่าน paremeter แบบสอบถามใน URL

การแก้ปัญหาก็ไม่ควรส่งผลกระทบต่อการตั้งค่าการควบคุมแคชหรือหมดอายุ

ขอบคุณ


1
ดูเหมือนว่าคุณใหม่ที่นี่ นี่เป็นคำถามที่ดี คุณควรโพสต์ไว้เช่นอาจเชื่อมโยงกลับไปที่คำถามนี้เพื่ออ้างอิง ฉันตั้งค่าสถานะนี้เพื่อให้ผู้ดูแลให้ความสนใจเพื่อช่วยคุณ
David Eyk

ดังที่ David ชี้ให้เห็นไซต์นี้ไม่เหมือนกับไซต์ฟอรัมอื่น ๆ หากคุณมีคำถามใหม่ให้ถามคลิกที่ปุ่ม "ถามคำถาม"
Mark Henderson

นี่คือการชี้แจงที่มีประโยชน์ หากคุณเปลี่ยนสไตล์ชีทของคุณคุณควรเก็บชื่อและการอ้างอิงไว้เหมือนเดิมแทนที่จะอัปเดตการอ้างอิงหลายร้อยรายการในเว็บไซต์
Mark Stosberg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.