บรรทัดคำขอที่นำทาง HTTP ของ Node ผ่านพร็อกซี
สร้างคำขอ HTTP ผ่านพร็อกซีแบบธรรมดาด้วยไคลเอนต์หลักของ Node โดยแยกปลายทางการเชื่อมต่อ เป้าหมายแบบสัมบูรณ์ และส่วนหัว Host
ในคำขอ HTTP ทั่วไปผ่านพร็อกซีส่งต่อ Node จะเชื่อมต่อกับพร็อกซีและส่ง URL ปลายทางในบรรทัดคำขอ ค่าสามค่าอธิบายคำขอนั้นหนึ่งรายการ:
| ค่า | ตัวอย่าง |
|---|---|
| ปลายทางการเชื่อมต่อ TCP | proxy.example:8080 |
| เป้าหมายของคำขอ | http://example.com/news?q=proxy |
| ส่วนหัว Host | example.com |
ตัวอย่าง Node 22 นี้ทำให้การแยกชัดเจน:
const http = require('node:http');
const destination = new URL('http://example.com/news?q=proxy');
const request = http.get({
hostname: 'proxy.example',
port: 8080,
path: destination.href,
headers: { Host: destination.host },
signal: AbortSignal.timeout(15000),
}, (response) => {
console.log(response.statusCode);
response.on('error', console.error);
response.resume();
});
request.on('error', console.error);
ปลายทางเป็นตัวแทน; เลือกผู้สมัครจากรายการพร็อกซี HTTPสำหรับการทดสอบ HTTP สาธารณะและตรวจสอบการตอบสนอง ตัวอย่างจะระบายการตอบสนองหลังจากพิมพ์สถานะ; แอปพลิเคชันสามารถใช้เนื้อหาแทนได้ คำถามยังคงเป็นส่วนหนึ่งของเป้าหมายคำขอ
ทำไม URL แบบเต็มจึงอยู่ที่นั่น
เซิร์ฟเวอร์ต้นทางมักได้รับเป้าหมายเช่น /news?q=proxy พร็อกซีส่งต่อต้องการปลายทางด้วย ดังนั้น HTTP/1.1 จึงกำหนดเป้าหมายในรูปแบบสัมบูรณ์:
GET http://example.com/news?q=proxy HTTP/1.1
Host: example.com
ตามกฎของ HTTP/1.1 พร็อกซีที่ได้รับรูปแบบสัมบูรณ์จะใช้อำนาจของ URI เมื่อส่งต่อและแทนที่ฟิลด์ Host ที่ได้รับซึ่งไม่สอดคล้องกัน การส่งส่วนหัว Host ของปลายทางที่สอดคล้องกันยังคงทำให้คำขอขาออกไม่กำกวม ชื่อโฮสต์ของการเชื่อมต่อใน Node เป็นตัวกลาง ดังนั้นตั้งค่าส่วนหัวอย่างตั้งใจแทนที่จะพึ่งพาที่อยู่การเชื่อมต่อนั้น
หากต้องมีการพิสูจน์ตัวตน ข้อมูลรับรองของพร็อกซีเป็นของฮอปของมันเอง ตัวเลือกคำขอ auth ของ Node สร้างส่วนหัว Authorization สำหรับทรัพยากร; ไม่ใช่ตัวเลือกการเข้าสู่ระบบพร็อกซีทั่วไป ใช้รูปแบบที่พร็อกซีต้องการและไคลเอนต์พร็อกซีที่เหมาะสมเมื่อการแลกเปลี่ยนซับซ้อนขึ้น
HTTPS เพิ่มอุโมงค์
ตัวอย่างนี้ครอบคลุมการส่งต่อ HTTP แบบธรรมดา การเชื่อมต่อ HTTPS ผ่านพร็อกซี HTTP ทั่วไปจะขอ CONNECT example.com:443 ก่อน แล้วจึงเริ่ม TLS ไปยังปลายทางภายในอุโมงค์ที่ยอมรับ การเปลี่ยน URL ของตัวอย่างเป็น HTTPS ไม่ได้เพิ่มขั้นตอนเหล่านั้น
สำหรับ HTTPS หรือภาระงานแบบผสม ให้ใช้เอเจนต์หรือตัวส่งพร็อกซีที่ได้รับการดูแลซึ่งมีการรองรับอุโมงค์ที่จำเป็น สำหรับ Node เวอร์ชันที่เข้ากันได้ ทางเลือกหนึ่งคือ fetch ของ Undici พร้อม ProxyAgent เก็บตัวอย่างไคลเอนต์หลักเล็ก ๆ นี้ไว้สำหรับกรณีที่การแลกเปลี่ยน HTTP แบบธรรมดาเองคือสิ่งที่คุณต้องควบคุมหรือทำความเข้าใจ