ฉันจำลองปัญหาของคุณ เมื่อฉันเชื่อมต่อกับอีกอันnc
แทนที่จะเป็นเบราว์เซอร์ฉันเห็นว่ามีการส่งการตอบกลับทันที ฉันคิดว่าเบราว์เซอร์ของคุณยังได้รับการตอบกลับ แต่เนื่องจากnc
ไม่ได้ยกเลิกการเชื่อมต่อเบราว์เซอร์ไม่ทราบว่ามันคือทั้งหมดและก็ตกลงเพื่อดำเนินการเปลี่ยนเส้นทาง
(หมายเหตุ: ในระหว่างการทดสอบของฉันฉันต้องการขั้นตอนสุดท้าย\r\n
ในการตอบกลับnc
เพื่อเปลี่ยนเส้นทางเบราว์เซอร์ของฉันให้สำเร็จดังนั้นตัวอย่างทั้งหมดของฉันใช้โปรแกรมแก้ไขนี้)
แก้ไข: แก้ไขง่าย ๆ
ที่นี่ฉันได้พบต่อไปนี้:
คำร้องขอ HTTP และการตอบกลับ HTTP ใช้รูปแบบข้อความทั่วไปของ RFC 822 สำหรับการถ่ายโอนข้อมูลที่ต้องการ รูปแบบข้อความทั่วไปนี้ประกอบด้วยสี่รายการต่อไปนี้
- [ ... ]
- [ ... ]
- บรรทัดว่าง (เช่นบรรทัดที่ไม่มีอะไรนำหน้า CRLF) ที่ระบุถึงจุดสิ้นสุดของฟิลด์ส่วนหัว
- [ ... ]
ดังนั้นคำตอบของคุณควรเป็น:
printf 'HTTP/1.1 302 Moved\r\nLocation: https://www.eff.org/\r\n\r\n' | ...
หลังจากได้รับสิ่งนี้แล้วเบราว์เซอร์ของคุณควรดำเนินการเปลี่ยนเส้นทางต่อไปยกเลิกการเชื่อมต่อไปยังnc
ในนามของตนเอง ในช่วงต้นเดือนธันวาคม 2017 ทำงานได้กับ Opera และ Vivaldi มันไม่ทำงานกับ Firefox, Chrome หรือ Safari ซึ่งคุณอาจต้องการการแก้ไขอื่น (ดูด้านล่าง)
คำตอบดั้งเดิมตอนนี้ด้อยกว่า (อาจเป็นประโยชน์สำหรับการสื่อสารที่ไม่ใช่ HTTP ด้วยnc
)
ตามคำตอบนี้บนเซิร์ฟเวอร์ผิดพลาดคุณจำเป็นต้องใช้-c
, -q
หรือตัวเลือกที่คล้ายกันขึ้นอยู่กับnc
การดำเนินงาน
ใน Debian ของฉันฉันมี-q
รุ่นที่สามารถติดตั้งได้ แล้วก็
printf 'HTTP/1.1 302 Moved\r\nLocation: https://www.eff.org/\r\n' | nc -q 0 -l -p 2345
ทำงานได้ดี (หมายเหตุฉันต้อง-p
ระบุพอร์ตด้วย) คำอธิบายคือ:
-q seconds
หลังจากที่EOF
เมื่อวันที่stdin
รอการระบุจำนวนวินาทีแล้วเลิก หากวินาทีเป็นลบให้รอตลอดไป (ค่าเริ่มต้น)
หากnc
ไม่มีตัวเลือกที่เหมาะสมการแก้ไขปัญหาอาจเป็นการตรวจจับการสื่อสารจากไคลเอนต์และฆ่าบรรทัดคำสั่งทั้งหมด ตัวอย่างที่ทำงานใน Debian ของฉันbash
:
printf 'HTTP/1.1 302 Moved\r\nLocation: https://www.eff.org/\r\n' | nc -l -p 2345 | { read foo; sleep 1; kill 0; }
เมื่อเรียกใช้ไพพ์bash
วางทุกกระบวนการในกลุ่มกระบวนการเดียว kill 0
ส่งสัญญาณไปยังกลุ่มกระบวนการทั้งหมด วิธีนี้nc
ถูกฆ่าตายประมาณ 1 วินาทีหลังจากการร้องขอใด ๆ read
ที่ได้รับการเรียกว่า
nc
กระบวนการนั้น“ ติดอยู่”? คุณทำstrace
หรือดมเครือข่ายหรือไม่? (2) แต่ก่อนอื่น\r\n
ให้ลองเพิ่มอันอื่นลงในส่วนท้ายของprintf
สตริงข้อความ