ในคำขอ HTTP ทั่วไปผ่านพร็อกซีส่งต่อ Node จะเชื่อมต่อกับพร็อกซีและส่ง URL ปลายทางในบรรทัดคำขอ ค่าสามค่าอธิบายคำขอนั้นหนึ่งรายการ:

ค่าตัวอย่าง
ปลายทางการเชื่อมต่อ TCPproxy.example:8080
เป้าหมายของคำขอhttp://example.com/news?q=proxy
ส่วนหัว Hostexample.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 แบบธรรมดาเองคือสิ่งที่คุณต้องควบคุมหรือทำความเข้าใจ

บทความที่เกี่ยวข้อง