Nhận tên máy chủ của yêu cầu hiện tại trong node.js Express


175

Vì vậy, tôi có thể thiếu một cái gì đó đơn giản ở đây, nhưng dường như tôi không thể tìm ra cách để có được tên máy chủ mà một đối tượng yêu cầu mà tôi đang gửi phản hồi được yêu cầu.

Có thể tìm ra tên máy chủ nào mà người dùng hiện đang truy cập từ node.js không?


Đó là trong tiêu đề yêu cầu. Chà tôi cũng nghĩ vậy nhưng bây giờ tôi không thấy nó ... hmmmm
jcolebrand

8
CJohn tìm thấy nó, nó ở request.headers.host- cảm ơn!
Jesse

Nghĩ vậy ... chỉ là không kéo nó ra khỏi ole noggin. Vui mừng bạn đã nhận nó!
jcolebrand

@Jlie Này, điều đó thực sự không đúng. request.headers.host không phải là tên máy chủ của máy chủ dựa trên HĐH, đó là tên tiêu đề máy chủ được gửi cùng với yêu cầu HTTP. Nếu máy chủ của bạn phản hồi bất kỳ yêu cầu HTTP nào bất kể tiêu đề máy chủ thì giá trị đó có thể là BẤT K that khách hàng nào quyết định gửi.
Rob Evans

@RobEvans - Nếu bạn đọc dòng cuối cùng của câu hỏi, đó chính xác là những gì tôi đang tìm kiếm. Một khách hàng gửi tiêu đề tên máy chủ giả là trường hợp sử dụng kỳ lạ mà cá nhân tôi không lo lắng về việc cố gắng hỗ trợ.
Jesse

Câu trả lời:


198

Nếu bạn đang nói về một yêu cầu HTTP, bạn có thể tìm thấy máy chủ yêu cầu trong:

request.headers.host

Nhưng điều đó phụ thuộc vào một yêu cầu đến.

Thông tin khác tại http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest

Nếu bạn đang tìm kiếm thông tin máy / bản địa, hãy thử đối tượng xử lý.


6
Ah, tuyệt vời - FWIW, sẽ không có cách nào để phát hiện máy chủ thực tế mà không có yêu cầu, bạn có thể có nhiều máy chủ được cấu hình, nhưng đây là thứ tôi đang tìm kiếm!
Jesse

2
Đã lừa, cảm ơn! Trong Express 4, tôi đã phải thực hiện cập nhật này: req.headers.host
Gene Bo

5
Sai lầm! request.headers.hosttrả về http://127.0.0.1nhưng không phải là một tên miền máy chủ sản xuất
Green

10
req.headers.hostđược cung cấp bởi người dùng. Tôi có thể tạo một yêu cầu trong 1 dòng python và gửi cho bạn một yêu cầu mà không có trường đó làm cho mã của bạn bị sập
arboreal84

1
request.headers.host hiện không được dùng nữa, thay vào đó bạn có thể sử dụng request.headers.hostname
Syam Danda

281

Bạn có thể sử dụng Mô-đun os:

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

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

Hãy cẩn thận:

  1. nếu bạn có thể làm việc với địa chỉ IP - Máy có thể có một số Thẻ mạng và trừ khi bạn chỉ định nút đó sẽ lắng nghe tất cả chúng, vì vậy bạn không biết yêu cầu nào được gửi đến, trước khi nó đến.

  2. Tên máy chủ là vấn đề DNS - Đừng quên rằng một số bí danh DNS có thể trỏ đến cùng một máy.


6
Mặc dù điều này sẽ hoạt động để có được tên máy chủ của máy, tôi có thể cài đặt máy để trả lời cho nhiều máy chủ, vì vậy điều này sẽ không chính xác.
Jesse

7
Tuy nhiên, cái này tốt hơn - bởi vì bạn có thể sử dụng nó trong các mô-đun không chạy luôn trong bối cảnh của ứng dụng HTTP
Radagast the Brown

8
Và quan trọng là cái này trả lời câu hỏi như nó đã được viết. Tôi nghĩ rằng câu hỏi thực sự sai nếu đây không phải là câu trả lời.
Rob Evans

3
Điều này tương quan với hostnamelệnh phải là tên DNS hợp lệ nhưng không bắt buộc phải có. Ví dụ: trong OS X, bạn sẽ nhận được những cái tên my-machine.localkhông thể phân giải được với DNS. Để tìm ra IP bên ngoài của máy, bạn sẽ cần phải đánh một dịch vụ thực hiện chức năng này hoặc sử dụng giao thức STUN để tìm ra nó.
tadman

6
Điều này luôn chính xác. Nó trả về tên máy chủ của máy, đó là tiêu đề của câu hỏi. (Văn bản của câu hỏi này hỏi một câu hỏi khác). Tên máy chủ được sử dụng cho yêu cầu HTTP đến là một vấn đề khác.
Cheeso

18

Đây là một thay thế

req.hostname

Đọc về nó trong Express Docs .


1
Đây là câu trả lời đúng, vì req.headers.host cung cấp cho máy chủ: port
ekerner

có gì khác nhau giữa req.hostname và req.host
RayLovless

1
req.host bị phản đối Nếu bạn sử dụng điều đó, express sẽ đưa ra cảnh báo 'không dùng nữa req.host: Thay vào đó hãy sử dụng req.hostname'
bruceczk

8

Nếu bạn cần một tên miền đủ điều kiện và không có yêu cầu HTTP, trên Linux, bạn có thể sử dụng:

var child_process = require("child_process");

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

1
BTW cũng có hostnamelệnh trong Windows (nhưng bạn gọi nó mà không có tham số)
jakub.g

7

Trước hết, trước khi đưa ra câu trả lời tôi muốn nói thẳng về thực tế rằng bằng cách tin tưởng vào các tiêu đề, bạn đang mở ra cánh cửa cho các lỗ hổng bảo mật như lừa đảo. Vì vậy, cho mục đích chuyển hướng, không sử dụng các giá trị từ các tiêu đề mà không xác thực URL trước được cho phép.

Sau đó, tên máy chủ hệ điều hành của bạn có thể không nhất thiết phải khớp với DNS. Trong thực tế, một IP có thể có nhiều hơn một tên DNS. Vì vậy, đối với các mục đích HTTP, không có gì đảm bảo rằng tên máy chủ được gán cho máy của bạn trong cấu hình hệ điều hành của bạn có thể sử dụng được.

Sự lựa chọn tốt nhất tôi có thể nghĩ đến là lấy IP công cộng trình nghe HTTP của bạn và giải quyết tên của nó thông qua DNS. Xem dns.reversephương pháp để biết thêm. Nhưng sau đó, một lần nữa, lưu ý rằng một IP có thể có nhiều tên được liên kết với nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.