nginx.conf ของฉันมีส่วน "เซิร์ฟเวอร์" หลายส่วน และส่วนเซิร์ฟเวอร์ที่รับทั้งหมด นี่คือตัวอย่าง nginx.conf เพื่อให้คุณมีความคิด:
ผู้ใช้ www-data;
worker_processes อัตโนมัติ
worker_cpu_affinity อัตโนมัติ
pid /run/nginx.pid;
เหตุการณ์ {
worker_connections 4000;
ใช้ epol;
ยอมรับ_mutex ปิด;
}
http {
รวม /etc/nginx/mime.types;
แอปพลิเคชัน default_type/octet-stream;
error_log /var/log/nginx/error.log;
เซิร์ฟเวอร์ {
ฟัง 80;
server_name foo.com;
ที่ตั้ง / {
default_type ข้อความ/ธรรมดา;
กลับ 200 "สวัสดีจาก foo.com";
}
error_page 500 502 503 504 /500.html;
}
เซิร์ฟเวอร์ {
ฟัง 80 default_server;
ชื่อเซิร์ฟเวอร์ _;
ที่ตั้ง / {
กลับ 403 "ขอโทษ";
}
}
}
ฉันคาดหวังว่าเซิร์ฟเวอร์จะส่งคืน 403 หากส่วนหัว "โฮสต์" เป็นอย่างอื่นนอกจาก "foo.com"
เห็นได้ชัดว่ามีใครบางคนใช้งาน Burp Suite บนเซิร์ฟเวอร์ของฉัน และฉันสังเกตเห็นพฤติกรรมที่น่าสนใจเมื่อพวกเขาส่งส่วนหัว "Host: foo.com:more-stuff-here": NGINX จะกำหนดเส้นทางคำขอไปยังส่วน "เซิร์ฟเวอร์" แรก ดูเหมือนว่าจะไม่สนใจเครื่องหมายทวิภาคและทุกอย่างหลังจากนั้นในค่าส่วนหัว
ฉันสามารถทำซ้ำในเครื่องด้วย nginx.conf ด้านบน:
$ curl -H "โฮสต์: foo.com" http://127.0.0.1
สวัสดีจาก foo.com
$ curl -H "โฮสต์: foo.com:unexpected-content" http://127.0.0.1
สวัสดีจาก foo.com
$ curl -H "โฮสต์: bar.com" http://127.0.0.1
ขอโทษ
ทำไม NGINX ถึงทำเช่นนี้? นี่เป็นพฤติกรรมที่คาดหวังหรือไม่? ฉันควรเปลี่ยนอะไรใน nginx.conf เพื่อให้แน่ใจว่าคำขอที่มีส่วนหัว "Host: foo.com:more-stuff-here" ไปที่บล็อกเริ่มต้น
อัปเดต: สำหรับใครก็ตามที่ค้นคว้าปัญหาเดียวกัน ฉันก็ได้สร้าง ตั๋วในตัวติดตามปัญหา NGINX.