모든 하위 도메인이 동일한 IP 주소를 가리키는 경우에도 Apache 웹 서버가 하위 도메인을 어떻게 감지하는지 궁금합니다. IP 주소는 하위 도메인을 가질 수 없으며 모든 도메인 이름은 결국 IP 주소로 확인된다는 점을 이해하고 있기 때문입니다.
예:
example1.domain.com resolves to => 192.24.17.65 take you to => example1 webpage
example2.domain.com resolves to => 192.24.17.65 take you to => example2 webpage
답변1
실제로 웹 초기에는 단일 IP에서 여러 웹사이트(다른 도메인, 단일 도메인의 하위 도메인 등)를 호스팅하는 것이 불가능했습니다.
그러나 1999년부터 HTTP 1.1로의 전환이 시작되었고 현재는 HTTP 1.0이 거의 사용되지 않습니다(사실 HTTP 2는 일반화되었지만 1.1은 여전히 일반화되어 있습니다).
HTTP 1.1 요청에는 Host: 헤더가 포함되어 있어 브라우저가 액세스하려는 도메인을 지정할 수 있습니다.
보내는 요청을 보려면 verbose 플래그를 사용하여 컬을 사용하여 이를 쉽게 확인할 수 있습니다.
# curl -Iv http://google.com/
* Trying 2a00:1450:4025:402::64:80...
* TCP_NODELAY set
* Connected to google.com (2a00:1450:4025:402::64) port 80 (#0)
> HEAD / HTTP/1.1
> Host: google.com
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 301 Moved Permanently
암호화된 사이트(SSL/TLS를 사용하는 HTTPS)로 이동하면 나머지 HTTP가 전송되기 전에 암호화된 핸드셰이크가 발생해야 하기 때문에 상황이 복잡해집니다(Host: 헤더 포함). 그러나 동일한 IP에서 호스팅되는 여러 사이트는 서로 다른 암호화 인증서를 사용할 수 있습니다.
현재 솔루션은 호스트 헤더 개념과 유사한 TLS 확장인 SNI(Server Name Indication)입니다. 즉, 연결 시도 초기에 서버에 연결하려는 도메인을 보내도록 브라우저에 요청합니다. 서버는 암호화된 핸드셰이크를 올바르게 완료할 수 있습니다.
답변2
이름 기반 가상 호스트에서 Apache는 다음을 사용합니다.서버 이름그리고서버 별칭지시문은 IP 주소 및 포트를 일치시킨 후 Host
HTTP 요청의 헤더를 지정된 도메인 이름과 일치시킵니다 .
ServerName
일치 하는 항목 이 없으면 ServerAlias
IP 주소 및 포트와 일치하는 첫 번째 나열된(기본) 가상 호스트가 요청을 수신합니다.
관련된:
- 이름 기반 가상 호스트 지원(아파치 문서)