ดังนั้นฉันอาจจะพลาดอะไรง่ายๆที่นี่ แต่ฉันไม่สามารถหาวิธีรับชื่อโฮสต์ที่วัตถุคำขอที่ฉันส่งคำตอบได้รับการร้องขอจาก
เป็นไปได้ไหมที่จะคิดชื่อโฮสต์ที่ผู้ใช้กำลังเยี่ยมชมจาก node.js?
request.headers.host
- ขอบคุณ!
ดังนั้นฉันอาจจะพลาดอะไรง่ายๆที่นี่ แต่ฉันไม่สามารถหาวิธีรับชื่อโฮสต์ที่วัตถุคำขอที่ฉันส่งคำตอบได้รับการร้องขอจาก
เป็นไปได้ไหมที่จะคิดชื่อโฮสต์ที่ผู้ใช้กำลังเยี่ยมชมจาก node.js?
request.headers.host
- ขอบคุณ!
คำตอบ:
หากคุณกำลังพูดถึงคำขอ HTTP คุณสามารถค้นหาโฮสต์คำขอได้ใน:
request.headers.host
แต่นั่นขึ้นอยู่กับการร้องขอที่เข้ามา
เพิ่มเติมได้ที่http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest
หากคุณกำลังมองหาข้อมูลเครื่องจักร / ดั้งเดิมให้ลองใช้วัตถุกระบวนการ
request.headers.host
ส่งคืนhttp://127.0.0.1
แต่ไม่ใช่ชื่อโดเมนเซิร์ฟเวอร์ผลิต
req.headers.host
ให้บริการโดยผู้ใช้ ฉันสามารถสร้างคำขอใน 1 บรรทัดของงูหลามและส่งคำขอโดยไม่ต้องเขตข้อมูลที่ทำให้รหัสของคุณผิดพลาด
คุณสามารถใช้โมดูลระบบปฏิบัติการ:
var os = require("os");
os.hostname();
ดูhttp://nodejs.org/docs/latest/api/os.html#os_os_hostname
คำเตือน:
หากคุณสามารถทำงานกับที่อยู่ IP - เครื่องอาจมีการ์ดเครือข่ายหลายใบและถ้าคุณไม่ระบุโหนดจะรับฟังได้ทั้งหมดดังนั้นคุณจึงไม่ทราบว่าคำขอ NIC ใดที่เข้ามาก่อนที่จะมา
ชื่อโฮสต์เป็นเรื่อง DNS - อย่าลืมว่าชื่อแทน DNS หลายรายการสามารถชี้ไปที่เครื่องเดียวกันได้
hostname
คำสั่งที่ควรเป็นชื่อ DNS ที่ถูกต้อง แต่ไม่จำเป็นต้องเป็น ตัวอย่างเช่นภายใต้ OS X คุณจะได้รับชื่อmy-machine.local
ที่ไม่สามารถแก้ไขได้ด้วย DNS ในการค้นหา IP ภายนอกของเครื่องคุณจะต้องใช้บริการที่มีฟังก์ชั่นนี้หรือใช้โปรโตคอล STUNเพื่อคิดออก
หากคุณต้องการชื่อโดเมนแบบเต็มและไม่มีการร้องขอ HTTP บน Linux คุณสามารถใช้:
var child_process = require("child_process");
child_process.exec("hostname -f", function(err, stdout, stderr) {
var hostname = stdout.trim();
});
hostname
คำสั่งใน Windows (แต่คุณเรียกใช้โดยไม่มีพารามิเตอร์)
ก่อนอื่นก่อนที่จะให้คำตอบฉันขอพูดอย่างตรงไปตรงมาเกี่ยวกับข้อเท็จจริงที่ว่าโดยการไว้วางใจในส่วนหัวคุณกำลังเปิดประตูสู่ช่องโหว่ด้านความปลอดภัยเช่นฟิชชิ่ง ดังนั้นเพื่อจุดประสงค์ในการเปลี่ยนเส้นทางอย่าใช้ค่าจากส่วนหัวโดยไม่ได้ตรวจสอบความถูกต้องของ URL ก่อนจึงจะได้รับอนุญาต
จากนั้นชื่อโฮสต์ระบบปฏิบัติการของคุณอาจไม่ตรงกับ DNS อันที่จริง IP หนึ่งรายการอาจมีชื่อ DNS มากกว่าหนึ่งชื่อ ดังนั้นเพื่อจุดประสงค์ HTTP จึงไม่รับประกันว่าจะสามารถใช้ชื่อโฮสต์ที่กำหนดให้กับเครื่องในการกำหนดค่าระบบปฏิบัติการของคุณได้
ทางเลือกที่ดีที่สุดที่ฉันสามารถนึกได้ก็คือการรับ IP สาธารณะของคุณฟัง HTTP และแก้ไขชื่อผ่าน DNS ดูdns.reverse
วิธีการสำหรับข้อมูลเพิ่มเติม แต่จากนั้นอีกครั้งโปรดทราบว่า IP อาจมีหลายชื่อที่เกี่ยวข้อง