node.js Expressで現在のリクエストのホスト名を取得します


175

そのため、ここでは単純なものが欠落している可能性がありますが、応答の送信先である要求オブジェクトが要求されたホスト名を取得する方法を見つけることができないようです。

ユーザーがnode.jsから現在アクセスしているホスト名を把握することはできますか?


リクエストヘッダーにあります。まあ私はそう思ったが、今は見えない...うーむ
jcolebrand

8
CJohnがそれを見つけましたrequest.headers.host
ジェシー

そう思った...単にそれをole nogginから引き出していませんでした。よかったです!
jcolebrand 2011

@ジェシーねえ、それは実際には正しくない。request.headers.hostは、OSに基づくサーバーのホスト名ではなく、HTTPリクエストと共に送信されるホストヘッダー名です。サーバーがホストヘッダーに関係なく任意のHTTP要求に応答する場合、その値はクライアントが送信することを決定したすべての値になる可能性があります。
Rob Evans 2013年

@RobEvans-質問の最後の行を読んだ場合、それがまさに私が探していたものです。偽のホスト名ヘッダーを送信するクライアントは、私が個人的にサポートを試みることを心配しない、奇妙なユースケースです。
ジェシー

回答:


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ユーザーによって提供されます。Pythonの1行でリクエストを作成し、そのフィールドなしでリクエストを送信してコードをクラッシュさせることができます
arboreal84

1
request.headers.hostは非推奨になりました。代わりにrequest.headers.hostnameを使用できます
Syam Danda

281

あなたはosモジュールを使うことができます:

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
これ、有効なDNS名である必要があるが必須ではないhostnameコマンドと相関します。たとえば、OS Xでは、DNSで解決できないような名前が表示されます。マシンの外部IPを把握するには、この機能を実行するサービスにアクセスするか、STUNプロトコルを使用して把握する必要があります。my-machine.local
tadman 2013年

6
これは常に正確です。質問のタイトルが尋ねたものであるマシンのホスト名を返します。(これのテキストは別の質問をしました)。着信HTTP要求で使用されるホスト名は別の問題です。
Cheeso 2013

18

ここに代替があります

req.hostname

Express Docsでそれについて読んでください。


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
ところでhostnameWindowsにもコマンドがあります(ただし、パラメーターなしで起動します)
jakub.g '28

7

まず、回答を提供する前に、ヘッダーを信頼することで、フィッシングなどのセキュリティの脆弱性への扉を開いているという事実について前向きに考えたいと思います。したがって、リダイレクトの目的で、URLが承認されていることを最初に検証することなくヘッダーの値を使用しないでください。

その場合、オペレーティングシステムのホスト名は必ずしもDNSのホスト名と一致しない場合があります。実際、1つのIPに複数のDNS名がある場合があります。したがって、HTTPの目的では、オペレーティングシステム構成でマシンに割り当てられたホスト名が使用可能である保証はありません。

私が考えることができる最良の選択は、HTTPリスナーのパブリックIPを取得し、その名前をDNS経由で解決することです。詳細については、dns.reverseメソッドを参照してください。ただし、繰り返しになりますが、IPには複数の名前が関連付けられている場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.