node.js Express에서 현재 요청의 호스트 이름 가져 오기


175

따라서 여기에 간단한 것이 누락되었을 수 있지만 응답을 보내려는 요청 객체가 요청 된 호스트 이름을 얻는 방법을 찾지 못하는 것 같습니다.

현재 node.js에서 사용자가 어떤 호스트 이름을 방문하고 있는지 알아낼 수 있습니까?


요청 헤더에 있습니다. 글쎄요, 그렇게 생각했지만 지금은 보이지 않습니다 ... hmmmm
jcolebrand

8
CJohn이 찾았습니다 request.headers.host-감사합니다!
Jesse

그렇게 생각했습니다 ... 올레 노긴에서 꺼내지 않았습니다. 다행입니다!
jcolebrand

@Jesse Hey, 실제로는 정확하지 않습니다. request.headers.host는 OS를 기반으로하는 서버의 호스트 이름이 아니며 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, 요청없이 실제 호스트를 감지 할 수있는 방법이 없습니다. 여러 호스트를 구성 할 수는 있지만 이것이 내가 찾고있는 것입니다!
Jesse

2
트릭을 했어, 고마워! Express 4에서이 업데이트를 수행해야했습니다. req.headers.host
Gene Bo

5
잘못된! 프로덕션 서버 도메인 이름은 request.headers.host반환 http://127.0.0.1하지 않습니다
Green

10
req.headers.host사용자가 제공합니다. 한 줄의 파이썬으로 요청을 작성하고 해당 필드없이 코드 충돌을 일으키는 요청을 보낼 수 있습니다.
arboreal84

1
request.headers.host 지금 대신에 당신이 request.headers.hostname 사용할 수 있습니다되지 않습니다
syam는 단다

281

os 모듈을 사용할 수 있습니다 :

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

http://nodejs.org/docs/latest/api/os.html#os_os_hostname을 참조 하십시오.

주의 사항 :

  1. IP 주소로 작업 할 수있는 경우-컴퓨터에 여러 개의 네트워크 카드가있을 수 있으며, 지정하지 않으면 노드가 모든 카드를 수신하므로 요청이 들어온 NIC가 어떤 NIC인지 알 수 없습니다.

  2. 호스트 이름은 DNS 문제입니다. 여러 DNS 별칭이 동일한 시스템을 가리킬 수 있다는 것을 잊지 마십시오.


6
이것은 컴퓨터의 호스트 이름을 얻는 데 효과적이지만 여러 호스트에 응답하도록 컴퓨터를 설정할 수 있으므로 정확하지 않습니다.
Jesse

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

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
BTW hostnameWindows 에도 명령이 있습니다 (그러나 매개 변수없이 호출)
jakub.g

7

우선, 답변을 제공하기 전에 헤더를 신뢰함으로써 피싱과 같은 보안 취약성에 대한 문을 열고 있다는 사실을 미리 알고 싶습니다. 따라서 리디렉션을 위해 먼저 URL이 인증되었는지 확인하지 않고 헤더의 값을 사용하지 마십시오.

그러면 운영 체제 호스트 이름이 반드시 DNS 이름과 일치하지 않아도됩니다. 실제로 하나의 IP에는 둘 이상의 DNS 이름이있을 수 있습니다. 따라서 HTTP 목적으로 운영 체제 구성에서 시스템에 지정된 호스트 이름을 사용할 수 있다는 보장은 없습니다.

내가 생각할 수있는 최선의 선택은 HTTP 리스너 공개 IP를 얻고 DNS를 통해 이름을 확인하는 것입니다. 자세한 내용은 dns.reverse방법을 참조하십시오. 그러나 IP에 여러 이름이 연결되어있을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.