올바른 이해와 사용 방법
현재 페이지의 URL 도메인(hostname) 정보(예: "www.example.com")는 $_SERVER['SERVER_NAME']을 사용하여 가져올 수 있습니다.
$_SERVER['SERVER_NAME']은 현재 URL의 도메인(hostname) 정보를 문자열 값으로 제공합니다.
문자열 값으로 제공되는 URL의 도메인(hostname) 정보
URL에서 도메인이란 www.example.com 또는 codingeverybody.kr처럼, 우리가 흔히 '도메인 주소'라고 하는 '도메인 이름'을 말합니다. 좀 더 기술적인 용어로 'hostname'이라고 합니다.
www.example.com
codingeverybody.kr
$_SERVER['SERVER_NAME']은 현재 URL에서 사용되는 hostname, 즉 도메인 정보를 문자열 값으로 제공합니다.
$_SERVER['SERVER_NAME']
슈퍼글로벌 변수인 $_SERVER는 현재 실행 중인 PHP 스크립트와 관련된 서버 및 실행 환경에 대한 정보가 키와 값으로 구성된 연관 배열입니다. 이 연관 배열에는 현재 실행 중인 URL 정보도 포함되어 있습니다. 이 URL 정보를 가지고 있는 키 중 $_SERVER['SERVER_NAME']은 현재 스크립트가 실행되는 서버 호스트의 이름이 문자열 값으로 설정됩니다.
기본 예제
/* 전체 URL 예: https://www.example.com/products/list?page=1#review */
echo $_SERVER['SERVER_NAME'];
// 출력: "www.example.com"
/* 전체 URL 예: https://codingeverybody.kr/javascript/ */
echo $_SERVER['SERVER_NAME'];
// 출력: "codingeverybody.kr"
$_SERVER['SERVER_NAME'] 만으로 도메인(hostname) 정보를 확인할 때의 한계
$_SERVER['SERVER_NAME']은 일반적인 웹 서버 환경에서 도메인(hostname) 정보를 확인하는 데 유용하지만, 모든 서버 환경에서 실제 클라이언트의 요청 도메인(hostname) 정보를 정확하게 판단할 수 있는 것은 아닙니다.
다음과 같은 상황일 수 있습니다.
- 일부 서버 환경(예: 스크립트가 가상 호스트에서 실행되는 경우)에서는
$_SERVER['SERVER_NAME']이 현재 클라이언트가 요청한 도메인(hostname)과 다르게 설정될 수 있으므로, 요청에 포함된 호스트 정보를 확인해야 할 수 있습니다. - Apache 2에서는
UseCanonicalName = On으로 설정하고ServerName을 지정해야 합니다. 그렇지 않으면 이 값은 클라이언트가 제공한 도메인(hostname) 정보를 반영합니다. - 또한 프록시(Proxy)나 로드 밸런서(Load Balancer) 등을 통해 요청이 전달되는 환경에서는 클라이언트가 요청한 도메인(hostname)과 PHP가 실행되는 웹 서버에서 인식하는 호스트 정보가 다를 수 있기 때문에 추가적인 확인이 필요할 수 있습니다.
이와 같은 상황에서는 $_SERVER['SERVER_NAME'] 값이 위조될 수 있습니다. 보안이 중요한 상황에서는 이 값에 의존하는 것이 안전하지 않습니다.
활용 예제
$_SERVER['SERVER_NAME']은 현재 PHP 스크립트가 실제 운영 중인 도메인에서 실행되는지, 아니면 개발 환경(localhost)이나 테스트 서버 환경에서 실행되는지를 구분하여 코드를 분리할 때 유용하게 사용합니다.
이러한 상황은 값의 위조 여부나 클라이언트가 요청한 정확한 도메인(hostname) 정보를 확인하기 위한 것이라기보다는, 미리 정한 도메인(hostname)을 기준으로 운영 환경과 개발·테스트 환경을 구분하여 코드를 다르게 실행하기 위한 활용 용도에 가깝습니다.
if ($_SERVER['SERVER_NAME'] === 'codingeverybody.kr') {
// 서비스 환경에서만 기능 활성화
echo '서비스 기능 활성화';
} else {
// 개발/테스트 환경에서는 기능 비활성화
echo '기능 비활성화';
}