ปัญหาอาจเกี่ยวข้องกับการขาดการรับรู้ของโปรโตคอลเมื่อพูดถึงการแคช เป็นเรื่องปกติที่คำขอ HTTP ที่ควรเปลี่ยนเส้นทางไปยังคำขอ HTTPS จะจบลงในแคช ซึ่งเปลี่ยนเส้นทางผู้ใช้ไปยังเวอร์ชัน HTTPS อย่างไม่มีเงื่อนไข แม้ว่าผู้ใช้จะร้องขอเวอร์ชัน HTTPS ก็ตาม
มีหลายวิธีในการแก้ไขปัญหานี้ ขึ้นอยู่กับประเภทของเว็บเซิร์ฟเวอร์ที่คุณใช้
เอาต์พุตวานิชล็อก
แต่ก่อนที่เราจะข้ามไปสู่ข้อสรุป ฉันต้องการเห็นบางอย่าง วานิชล็อก
เอาต์พุต
ฉันต้องการเห็นผลลัพธ์ของคำสั่งต่อไปนี้เมื่อเกิด redirect loop:
varnishlog -g คำขอ -q "ReqUrl eq '/'"
ข้อสันนิษฐานคือปัญหาเกิดขึ้นในหน้าแรกที่เราเพิ่มเป็นแบบสอบถาม VSL ไปยัง วานิชล็อก
สั่งการ.
ฉันสังเกตเห็นคุณ เคลือบเงา
เอาต์พุต แต่น่าเสียดายที่มันจำกัดเกินไปในแง่ของเอาต์พุต วานิชล็อก
ดีกว่ามากสำหรับการดีบักในขณะที่ เคลือบเงา
เป็นเพียง
การทดสอบสมมติฐาน
หากการวนซ้ำการเปลี่ยนเส้นทางเกิดจากการขาดการรับรู้ของโปรโตคอล เราสามารถทำให้เกิดปัญหาได้ดังนี้:
- วิ่ง
varnishadm ห้าม obj.status "!=" 0
เพื่อล้างแคช
- เรียกใช้ HTTP URL ธรรมดาของเว็บไซต์เพื่อให้แน่ใจว่าเวอร์ชันนี้ถูกแคชไว้
- โทร HTTPS URL ของเว็บไซต์เพื่อตรวจสอบว่าคุณติดอยู่ในลูปเปลี่ยนเส้นทางหรือไม่
แก้ไขปัญหา
หากการทดสอบทั้งหมดรวมกันและสมมติฐานได้รับการพิสูจน์ การแก้ปัญหานั้นค่อนข้างง่าย
หากคุณใช้ Apache เป็นเว็บเซิร์ฟเวอร์ คุณสามารถเพิ่มเนื้อหาต่อไปนี้ลงใน .htaccess
ไฟล์:
SetEnvIf X-Forwarded-Proto "https" HTTPS=on
ส่วนหัวต่อท้าย Vary: X-Forwarded-Proto
มิฉะนั้น คุณสามารถเพิ่มรหัสต่อไปนี้ในไฟล์ VCL ของคุณ:
ย่อย vcl_backend_response {
ถ้า (beresp.http.Vary) {
ถ้า (beresp.http.Vary !~ "X-Forwarded-Proto") {
ตั้ง beresp.http.Vary = ตั้ง beresp.http.Vary + ", X-Forwarded-Proto";
}
} อื่น {
ตั้ง beresp.http.Vary = "X-Forwarded-Proto";
}
}
การเพิ่ม X-ส่งต่อโปรโต
ไปที่ ต่างกันไป
ส่วนหัวจะทำให้แน่ใจว่าวานิชสร้างวัตถุแยกกันในแคชสำหรับ HTTP และ HTTPS
ฉันยังถือว่าพร็อกซี TLS ของคุณส่งไฟล์ X-ส่งต่อโปรโต
หัวข้อ.
อัปเดต: ตรวจสอบบันทึก
หลังจากแสดงความคิดเห็นกลับไปกลับมา ฉันได้รับบันทึกเชิงลึกผ่านทาง https://pastebin.com/QzPh1r5R ที่อธิบายสิ่งที่เกิดขึ้น
ใน ** << BeReq >> 951078
คุณสามารถดู X-ส่งต่อโปรโต: http
หัวข้อ. ซึ่งหมายความว่าคำขอถูกส่งผ่านคำขอ HTTP ธรรมดา คำขอประเภทนี้ควรส่งผลให้มีการเปลี่ยนเส้นทาง 301 และดำเนินการตามบรรทัดบันทึกต่อไปนี้:
-- Berespโปรโตคอล HTTP/1.1
-- BerespStatus 301
-- BerespReason ย้ายอย่างถาวร
-- BerespHeader วันที่: พฤ. 13 ม.ค. 2565 08:55:17 น. GMT
-- เซิร์ฟเวอร์ BerespHeader: Apache
-- ตำแหน่ง BerespHeader: https://[โดเมนวานิช]/
-- ความยาวของเนื้อหา BerespHeader: 238
-- ประเภทเนื้อหา BerespHeader: text/html; ชุดอักขระ=iso-8859-1
-- TTL RFC 120 10 0 1642064118 1642064118 1642064117 0 0 แคชได้
การเปลี่ยนเส้นทางไม่เพียงเกิดขึ้นเท่านั้น แต่ยังได้รับการแคชเป็นเวลา 120 วินาทีอีกด้วย นอกจากนี้ยังน่าสนใจที่จะเห็นว่าไม่มี ต่างกันไป: X-Forwarded-Proto
หัวข้อ.
ในเวลาต่อมา พ * << ขอ >> 951080
ธุรกรรมปรากฏขึ้นในบันทึก เราเห็นส่วนหัวของคำขอต่อไปนี้:
- ReqHeader X-Forwarded-Proto: https
- ReqHeader Host: [โดเมนวานิชอื่น]
ดังนั้นนี่คือคำขอ HTTPS สำหรับโดเมน Varnish อื่น และด้วยเหตุผลบางอย่าง ส่งผลให้เกิดการเข้าชมแคชที่ส่งคืน a ต่างกันไป
หัวข้อ:
- RespHeader แตกต่างกันไป: ยอมรับการเข้ารหัส, คุกกี้, X-Forwarded-Proto
- VCL_call HIT
- กด 886585 90003.966201 10.000000 0.000000
ไม่เพียงแต่คุณเห็นการเข้าชม คุณยังสามารถสรุปได้ว่าวัตถุนั้นถูกแทรกในแคชโดยธุรกรรม 886585
.
แม้ว่าจะเป็นการดีที่จะมี ต่างกันไป
ส่วนหัวอันนี้ประกอบด้วย คุกกี้
ค่าที่เป็นอันตรายซึ่งหมายความว่าวัตถุแยกต่างหากจะถูกเก็บไว้ในแคชสำหรับทุกค่าคุกกี้ที่เป็นไปได้ซึ่งแสดงต่อวานิช สิ่งนี้ค่อนข้างอันตราย ดังนั้นโปรดลบออก คุกกี้
จาก ต่างกันไป
ส่วนหัวและติดกับ แตกต่างกันไป: ยอมรับการเข้ารหัส, X-Forwarded-Proto
.
ธุรกรรมล่าสุดที่ฉันดูคือ * << ขอ >> 951082
. มันมี X-ส่งต่อโปรโต: https
ส่วนหัวของคำขอและไม่ควรส่งผลให้เกิดการเปลี่ยนเส้นทาง 301 แต่น่าเสียดายที่เป็นเช่นนั้น
เดอะ ตี
แท็กเปิดเผยข้อมูลที่น่าสนใจ:
- กด 951078 82.391648 10.000000 0.000000
ออบเจกต์ที่ถูกโจมตีแต่เดิมถูกแทรกในแคชโดยธุรกรรม 951078
. หากคุณให้ความสนใจอย่างใกล้ชิด นั่นคือสิ่งแรกที่เรากล่าวถึง ธุรกรรมนี้เป็นธุรกรรม HTTP เท่านั้นที่ส่งผลให้เกิดการเปลี่ยนเส้นทาง 301
และนั่นคือวัตถุที่ส่งคืน ดังนั้น แม้ว่าคุณจะร้องขอเนื้อหา HTTPS คุณก็ยังถูกเปลี่ยนเส้นทางและนั่นคือวิธีที่คุณลงเอยด้วยการวนซ้ำไม่รู้จบ
หากคุณดูการตอบสนองที่ส่งกลับโดยธุรกรรม 951082
คุณไม่เห็น ต่างกันไป
หัวข้อ:
- โปรโตคอลการตอบสนอง HTTP/1.1
- สถานะตอบกลับ 301
- RespReason ย้ายอย่างถาวร
- วันที่ตอบกลับ: พฤ. 13 ม.ค. 2565 08:55:17 น. GMT
- เซิร์ฟเวอร์ RespHeader: Apache
- ตำแหน่ง RespHeader: https://[โดเมนวานิช]/
- ความยาวเนื้อหา RespHeader: 238
- ประเภทเนื้อหา RespHeader: text/html; ชุดอักขระ=iso-8859-1
- RespHeader X-วานิช: 951082 951078
- อายุหัวหน้าทีม: 37
- RespHeader ผ่าน: 1.1 วานิช (วานิช/7.0)
บทสรุป: กรุณาตรวจสอบให้แน่ใจว่า X-ส่งต่อโปรโต
ถูกเพิ่มเข้าไปในของคุณ ต่างกันไป
หัวข้อ. มันจะป้องกันการติดอยู่ในวงเปลี่ยนเส้นทาง