รับชื่อโฮสต์ของคำขอปัจจุบันใน node.js Express


175

ดังนั้นฉันอาจจะพลาดอะไรง่ายๆที่นี่ แต่ฉันไม่สามารถหาวิธีรับชื่อโฮสต์ที่วัตถุคำขอที่ฉันส่งคำตอบได้รับการร้องขอจาก

เป็นไปได้ไหมที่จะคิดชื่อโฮสต์ที่ผู้ใช้กำลังเยี่ยมชมจาก node.js?


มันอยู่ในส่วนหัวของคำขอ ฉันคิดอย่างนั้น แต่ตอนนี้ฉันไม่เห็น ... hmmmm
jcolebrand

8
CJohn พบมันอยู่ในrequest.headers.host- ขอบคุณ!
เจสซี่

คิดว่า ... แค่ไม่ดึงมันออกมาจากแก้วเหล้าเล็ก ๆ ดีใจที่คุณได้รับมัน!
jcolebrand

@Jesse Hey ที่ไม่ถูกต้องจริง request.headers.host ไม่ใช่ชื่อโฮสต์ของเซิร์ฟเวอร์ตามระบบปฏิบัติการ แต่เป็นชื่อส่วนหัวของโฮสต์ที่ส่งไปพร้อมกับคำขอ HTTP หากเซิร์ฟเวอร์ของคุณตอบสนองต่อคำขอ HTTP ใด ๆ โดยไม่คำนึงถึงส่วนหัวของโฮสต์ค่านั้นอาจเป็นสิ่งที่ลูกค้าตัดสินใจที่จะส่ง
Rob Evans

@RobEvans - หากคุณอ่านบรรทัดสุดท้ายของคำถามนั่นคือสิ่งที่ฉันกำลังมองหา ลูกค้าที่ส่งส่วนหัวชื่อโฮสต์ปลอมเป็นกรณีการใช้งานที่แปลกประหลาดที่ฉันไม่ต้องกังวลเกี่ยวกับการสนับสนุน
Jesse

คำตอบ:


198

หากคุณกำลังพูดถึงคำขอ HTTP คุณสามารถค้นหาโฮสต์คำขอได้ใน:

request.headers.host

แต่นั่นขึ้นอยู่กับการร้องขอที่เข้ามา

เพิ่มเติมได้ที่http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest

หากคุณกำลังมองหาข้อมูลเครื่องจักร / ดั้งเดิมให้ลองใช้วัตถุกระบวนการ


6
อ่าน่ากลัว - FWIW ไม่มีทางที่จะตรวจพบโฮสต์จริงโดยไม่มีการร้องขอคุณสามารถกำหนดค่าโฮสต์ได้หลายเครื่อง แต่นี่คือสิ่งที่ฉันกำลังมองหา!
เจสซี่

2
ไม่หลอกลวงขอบคุณ! ใน Express 4 ฉันต้องทำการอัปเดตนี้: req.headers.host
Gene Bo

5
ไม่ถูกต้อง! request.headers.hostส่งคืนhttp://127.0.0.1แต่ไม่ใช่ชื่อโดเมนเซิร์ฟเวอร์ผลิต
Green

10
req.headers.hostให้บริการโดยผู้ใช้ ฉันสามารถสร้างคำขอใน 1 บรรทัดของงูหลามและส่งคำขอโดยไม่ต้องเขตข้อมูลที่ทำให้รหัสของคุณผิดพลาด
arboreal84

1
request.headers.host เลิกใช้แล้ว แต่คุณสามารถใช้ request.headers.hostname แทนได้
Syam Danda

281

คุณสามารถใช้โมดูลระบบปฏิบัติการ:

var os = require("os");
os.hostname();

ดูhttp://nodejs.org/docs/latest/api/os.html#os_os_hostname

คำเตือน:

  1. หากคุณสามารถทำงานกับที่อยู่ IP - เครื่องอาจมีการ์ดเครือข่ายหลายใบและถ้าคุณไม่ระบุโหนดจะรับฟังได้ทั้งหมดดังนั้นคุณจึงไม่ทราบว่าคำขอ NIC ใดที่เข้ามาก่อนที่จะมา

  2. ชื่อโฮสต์เป็นเรื่อง DNS - อย่าลืมว่าชื่อแทน DNS หลายรายการสามารถชี้ไปที่เครื่องเดียวกันได้


6
แม้ว่าสิ่งนี้จะทำงานเพื่อให้ได้ชื่อโฮสต์ของเครื่อง แต่ฉันสามารถตั้งค่าเครื่องให้ตอบโฮสต์หลาย ๆ เครื่องได้ดังนั้นสิ่งนี้จะไม่ถูกต้อง
เจสซี่

7
อย่างไรก็ตามอันนี้ดีกว่า - เพราะคุณสามารถใช้มันในโมดูลที่ไม่ได้ทำงานในบริบทของแอพ HTTP เสมอ
Radagast the Brown

8
และที่สำคัญอันนี้ตอบคำถามตามที่เขียนไว้ ฉันคิดว่าคำถามนี้ผิดจริง ๆ ถ้านี่ไม่ใช่คำตอบ
Rob Evans

3
สิ่งนี้สัมพันธ์กับhostnameคำสั่งที่ควรเป็นชื่อ DNS ที่ถูกต้อง แต่ไม่จำเป็นต้องเป็น ตัวอย่างเช่นภายใต้ OS X คุณจะได้รับชื่อmy-machine.localที่ไม่สามารถแก้ไขได้ด้วย DNS ในการค้นหา IP ภายนอกของเครื่องคุณจะต้องใช้บริการที่มีฟังก์ชั่นนี้หรือใช้โปรโตคอล STUNเพื่อคิดออก
tadman

6
สิ่งนี้ถูกต้องเสมอ จะส่งคืนชื่อโฮสต์ของเครื่องซึ่งเป็นชื่อของคำถามที่ถาม (ข้อความของคำถามนี้ถามคำถามอื่น) ชื่อโฮสต์ที่ใช้กับคำขอ HTTP ที่เข้ามานั้นแตกต่างกัน
Cheeso

18

นี่คือทางเลือก

req.hostname

อ่านเกี่ยวกับเรื่องนี้ในเอ็กซ์เพรสเอกสาร


1
นี่คือคำตอบที่ถูกต้องเนื่องจาก req.headers.host ให้โฮสต์: พอร์ต
ekerner

ความแตกต่างระหว่าง req.hostname และ req.host คืออะไร
RayLoveless

1
req.host เลิกใช้แล้ว หากคุณใช้งาน Express จะแสดงข้อความเตือนว่า 'ไม่รองรับ req.host: ใช้ req.hostname แทน'
bruceczk

8

หากคุณต้องการชื่อโดเมนแบบเต็มและไม่มีการร้องขอ HTTP บน Linux คุณสามารถใช้:

var child_process = require("child_process");

child_process.exec("hostname -f", function(err, stdout, stderr) {
  var hostname = stdout.trim();
});

1
BTW ยังมีhostnameคำสั่งใน Windows (แต่คุณเรียกใช้โดยไม่มีพารามิเตอร์)
jakub.g

7

ก่อนอื่นก่อนที่จะให้คำตอบฉันขอพูดอย่างตรงไปตรงมาเกี่ยวกับข้อเท็จจริงที่ว่าโดยการไว้วางใจในส่วนหัวคุณกำลังเปิดประตูสู่ช่องโหว่ด้านความปลอดภัยเช่นฟิชชิ่ง ดังนั้นเพื่อจุดประสงค์ในการเปลี่ยนเส้นทางอย่าใช้ค่าจากส่วนหัวโดยไม่ได้ตรวจสอบความถูกต้องของ URL ก่อนจึงจะได้รับอนุญาต

จากนั้นชื่อโฮสต์ระบบปฏิบัติการของคุณอาจไม่ตรงกับ DNS อันที่จริง IP หนึ่งรายการอาจมีชื่อ DNS มากกว่าหนึ่งชื่อ ดังนั้นเพื่อจุดประสงค์ HTTP จึงไม่รับประกันว่าจะสามารถใช้ชื่อโฮสต์ที่กำหนดให้กับเครื่องในการกำหนดค่าระบบปฏิบัติการของคุณได้

ทางเลือกที่ดีที่สุดที่ฉันสามารถนึกได้ก็คือการรับ IP สาธารณะของคุณฟัง HTTP และแก้ไขชื่อผ่าน DNS ดูdns.reverseวิธีการสำหรับข้อมูลเพิ่มเติม แต่จากนั้นอีกครั้งโปรดทราบว่า IP อาจมีหลายชื่อที่เกี่ยวข้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.