일부 웹 서버는 IP 주소를 사용하여 액세스하면 직접 IP 주소 액세스가 허용되지 않는다는 오류를 반환합니다.
나는 이것이 어떻게 작동하는지 궁금 해왔다. 브라우저가 항상 IP 주소를 확인하여 연결하지는 않습니까? "직접 IP 주소 액세스"가 단순히 DNS를 건너 뛰지 않습니까? 원격 서버는 DNS를 건너 뛴 것을 어떻게 알 수 있습니까?
일부 웹 서버는 IP 주소를 사용하여 액세스하면 직접 IP 주소 액세스가 허용되지 않는다는 오류를 반환합니다.
나는 이것이 어떻게 작동하는지 궁금 해왔다. 브라우저가 항상 IP 주소를 확인하여 연결하지는 않습니까? "직접 IP 주소 액세스"가 단순히 DNS를 건너 뛰지 않습니까? 원격 서버는 DNS를 건너 뛴 것을 어떻게 알 수 있습니까?
답변:
그것이 어떻게 아는지에 대한 질문에 대답하려면 브라우저가 서버를 보내는 것과 관련이 있습니다.
시스템은 항상 IP 주소로 시스템을 확인하지만 브라우저는 HTTP 헤더에서 액세스하려는 URL을 보냅니다.
다음은 온라인에서 찾은 샘플 헤더입니다. Windows에서 Firefox를 사용 apple.com
하고 주소 표시 줄에 입력 한 것처럼 수정되었습니다 .
GET / HTTP/1.1
Host: apple.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
IP 주소를 사용한 경우 헤더는 다음과 같습니다.
GET / HTTP/1.1
Host: 17.142.160.59
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
둘 다 소켓을 통해 동일한 IP 주소로 전송되지만 브라우저는 서버에 액세스 한 내용을 서버에 알려줍니다.
왜? IP 주소가 동일한 웹 서버는 여러 사이트를 호스팅하고 각 사이트마다 다른 페이지를 제공 할 수 있습니다. IP 주소별로 페이지를 원하는 사용자를 모두 구별 할 수는 없지만 HTTP 헤더로 페이지를 구별 할 수 있습니다.
HTTP 1.1 프로토콜을 사용하면 (이전 HTTP 1.0 버전은 오랫동안 사용되지 않아 최신 버전의 브라우저에서 사용되지 않을 수 있음) host
헤더가 도입되었습니다. 들어 HTTP 1.1 브라우저에서 발급 한 것이어야합니다 필요한 헤더 행입니다 . 도메인 이름은 브라우저에서 해당 행에 포함됩니다 (예 :) Host: example.com
. 따라서 웹 서버는 브라우저가 해당 라인에서 액세스하려는 웹 사이트를 알고 있습니다. 웹 서버는 수십 개의 웹 사이트를 지원할 수 있으므로 요청 된 페이지가있는 웹 사이트를 결정하는 데 중요합니다. 브라우저가 example.com의 사이트 홈 페이지에 액세스하려고한다고 가정하면, 서버에 연결될 때 서버에 다음 행을 발행합니다.
GET / HTTP/1.1
이 줄은 브라우저가 웹 사이트의 루트 문서 (예 : "/")를 가져 오도록 지정합니다. 액세스를 원한다면 /somedir/testpage.html
, GET /somedir/testpage.html
은 "수"라인에있을 것입니다. 행 뒤에는 다음 행이 있습니다.
Host: example.com
따라서 웹 서버가 example.com, someothersite.com, yetanothersite.org 등의 웹 사이트를 지원하는 경우 example.com의 기본 페이지를 반환해야한다는 것을 알고 있습니다. 해당 줄을 얻지 못하거나 해당 줄에 도메인 이름 Host
이 없으면 어떤 웹 사이트의 홈페이지를 반환해야하는지 알 수 없습니다. 따라서 대신 오류 메시지를 표시하거나 서버의 "기본"사이트에 대한 홈 페이지를 리턴 할 수 있습니다.
텔넷 프로토콜을 사용하여 브라우저에서 실행하는 것과 동일한 명령을 실행할 수 있습니다 ( 예 : telnet example.com 80
Linux 쉘 프롬프트 또는 Apple OS X 터미널 창). 기본 HTTP 포트, 포트 80에 연결- 단계는 PuTTY 를 사용하여 웹 사이트에 대한 액세스 테스트를 참조 하십시오 Windows 시스템에서 PuTTY를 사용하여이를 수행합니다.
이것은 Host:
HTTP 헤더 때문입니다. 동일한 IP 주소로 여러 사이트를 호스팅 할 때 매우 유용합니다. 예를 들어 http://www.k7dxs.net/ 과 http://www.philipgrimes.com/ 은 모두 동일한 IP 주소에 있습니다. 그러나 Host:
헤더로 인해 서로 다른 두 사이트를 표시 할 수 있습니다.
@Toothbrush가 지적한 HTTPS의 경우 Host 헤더는 암호화 된 요청의 일부이므로 서버는이 인증서가 없으면 어떤 인증서를 제공할지 알지 못하므로 TLS 서버 이름 표시를 사용합니다.
재미있는 실험 : Firefox 용 변조 데이터 가져 오기 (Chrome과 동등한 기능을 찾지 못함)를 변경합니다. http://slipstation.com/을 열고 Host:
요청 에서 헤더를 http://www.zombo.com/으로 편집 하십시오 . 가능한 모든 것이 가능한 친숙한 웹 사이트가 표시됩니다.
웹 서버는 특정 도메인 또는 하위 도메인에 대한 연결 만 허용하도록 구성 할 수 있습니다. 여러 도메인을 호스팅 할 수 있습니다.
직접 IP 주소를 사용할 때 웹 서버가 수행하는 작업을 구성 할 수 있습니다. Apache의 경우 기본적으로 활성화 된 사이트에서 이름이 지정된 vhost (알파벳순으로 정렬 됨)로 이동합니다.
이것은 빠른 검색 후 찾은 Apache 설명서에서 가장 관련성이 높은 부분입니다.
https://httpd.apache.org/docs/current/vhosts/name-based.html