2011-05-14 9 views
9

HTTP/1.1을 정의하는 RFC 2616에 따르면 Host: 헤더는 필수 항목입니다.HTTP 호스트 헤더가 언제 정의되지 않습니까?

클라이언트는 모든 HTTP/1.1 요청 메시지에 호스트 헤더 필드를 포함해야합니다.

그러나 PHP manual는 비어있을 수 있음을 의미한다 :

'HTTP_HOST': 호스트의 내용 : 현재 요청 헤더를, 존재하는 경우.

어떤 상황에서이 헤더가 비어서 $_SERVER['HTTP_HOST']이 비어있을 수 있습니까? 내 응용 프로그램이 거기에 있다는 것에 의존 할 수 있습니까?

+0

[Host :] 헤더는 [HTTPbis] (http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-14#appendix-B.1.1)에 따라 '필수'입니다. 그러나 그것이 항상 존재한다는 것을 의미하지는 않습니다. 아파치는 결석을 우아하게 처리한다. (설정 한 가상 호스트에 도달하지는 않겠지 만). – mario

+0

@mario :'Host :'헤더를 보내지 않는 실제 HTTP/1.1 클라이언트가 있습니까? – Tim

+2

나는 그것들을 실제 클라이언트로 생각하지 않을 것이고, 현대의 브라우저와 라이브러리는 전혀 없다. 그러나 수작업으로 작성된 PHP 스크립트가있을 수 있습니다. 하지만 여전히 대부분 구성 문제이며 Apache vhost와는 관련이 없습니다. HTTP_HOST는 Apache에 의해 사전 검사되며, 실제로 비어있는 것에 대해 걱정하지 않을 것입니다. 있을 법하지 않은 엣지 케이스. – mario

답변

13

HTTP 1.0에서는 비워 둘 수 있습니다. 호스트 헤더를 지정하지 않으면 가상 호스팅이 전혀 작동하지 않으므로 웹 서버의 기본 가상 호스트가 사용됩니다.

방금 ​​테스트 해 보았습니다. PHP에서 Nginx의 $_SERVER['HTTP_HOST'] 변수는 가상 호스트의 이름으로 설정되었는데, 내 경우에는 _입니다. 하지만 그것도 Nginx의 fastcgi_params 구성에 따라 다릅니다.

공유 호스팅에서는 기본 가상 호스트가 호스팅 회사의 정보 페이지로 설정되어 스크립트가 실행되지 않으므로 이는 중요하지 않습니다. 그래도 자신의 서버를 염두에 두는 것이 좋습니다.

+0

"HTTP_HOST"는 무엇을 의미합니까? $ http_host? –

+0

4 년 전부터 답을 찾아내는 것이 좋습니다! :-)이 문제는 전혀 기억이 나지 않지만, PHP로 많은 작업을했기 때문에 PHP 변수 인 $ _SERVER [ 'HTTP_HOST']를 Nginx fastcgi_param으로 보낸 것 같습니다. 그 설정 파일이 더 이상 남아 있지 않지만 읽을 [이] (http://stackoverflow.com/a/15414811/238978) 그래서 나는'$ 호스트'Nginx 변수되었을 수도 있습니다. –

+0

답변 해 주셔서 감사합니다! 그렇다면 답을 약간 혼동하기 때문에 분명히하기 위해 : nginx는 가상 호스트 이름에'$ http_host'를 설정하지 않고 원래 HTTP 헤더 필드 "Host"를 복사합니다 . 그리고 이것이 비어 있다면,'$ http_host'도 마찬가지입니다. –

6

크롤러 (예 : Google), 스크래퍼 또는 API와 상호 작용하는 완벽한 스크립트가 우연히 또는 무의식적으로 호스트 헤더를 건너 뛸 수 있습니다.

동일한 질문을 할 때 Google에서이 질문이 나왔기 때문에이 답변을 추가했습니다.

관련 문제