ฉันได้แก้ปัญหาโดยไม่เข้าใจจริงๆ
มีเจ็ดเว็บไซต์บนเซิร์ฟเวอร์ของฉัน และหกเว็บไซต์ทำงานได้อย่างถูกต้อง (http เปลี่ยนเส้นทางไปที่ https ตามที่คาดไว้)
ไซต์ทั้งเจ็ดมีบล็อกที่ส่วนท้ายของไฟล์กำหนดค่า NginX ที่มีลักษณะดังนี้:
เซิร์ฟเวอร์ {
# เปลี่ยนเส้นทางการรับส่งข้อมูลจาก http ไปยัง https สำหรับแต่ละโดเมนที่เกี่ยวข้อง
ถ้า ($host = svija.love) {
ส่งคืน 301 https://$host$request_uri;
} # จัดการโดย Certbot
# รับรองว่าคำขอที่ตรวจจับได้จะไม่ถูกเปลี่ยนเส้นทางโดยไม่ตั้งใจ
ฟัง 80;
server_name svija.love;
กลับ 404; # จัดการโดย Certbot
}
โฮสต์เซิร์ฟเวอร์ที่แท้จริงคือ live.svija.loveแต่เว็บไซต์ที่มีปัญหานั้นเป็นเพียง svija.ความรัก (ไม่มีเว็บไซต์ที่กำหนดค่าสำหรับ live.svija.love)
เห็นได้ชัดว่าปัญหาเกิดจากบรรทัดต่อไปนี้ไม่ได้รับการประเมินอย่างถูกต้อง:
ถ้า ($host = svija.love) {
ตามหลักแล้ว ไม่มีการกำหนดค่า IPv6 สำหรับเซิร์ฟเวอร์ (live.svija.love) และมีการกำหนดค่า IPv6 สำหรับเว็บไซต์ (svija.love) ซึ่งไม่ควรมีอยู่จริง
ฉันเพิ่มบันทึก IPv6 สำหรับเซิร์ฟเวอร์ และลบสำหรับเว็บไซต์
สิ่งนี้ไม่ส่งผลกระทบต่อปัญหา
แล้วฉันก็คิดว่าบางที $โฮสต์ ตัวแปรถูกตั้งค่าเป็น live.svija.love (ใครจะไปรู้ว่าทำไม) ก็เลยลองทดสอบเปลี่ยนดู
ถ้า ($host = svija.love) {
ถึง
ถ้า ($host = live.svija.love) {
ตามที่คาดไว้ หน้าเริ่มต้นของ NginX ถูกแทนที่ด้วยข้อผิดพลาด 404 (ดูบล็อกการกำหนดค่าด้านบน)
ดังนั้นฉันใส่กลับ
ถ้า ($host = live.svija.love) {
และตอนนี้ทุกอย่างทำงานได้อย่างถูกต้อง คำขอ HTTP ไปยัง svija.love ถูกเปลี่ยนเส้นทางไปที่ https://svija.love และปัญหาของฉันก็ได้รับการแก้ไข
ฉันคิดว่ามีกลไกการแคช DNS บางอย่างใน NginX ที่ล้มเหลว อาจเป็นเพราะฉันเปลี่ยนชื่อเซิร์ฟเวอร์เมื่อถึงจุดหนึ่งในอดีต