URL 구성 요소
/* 전체 URL 예: https://www.example.com/products/list?page=1 */

// $_SERVER의 HTTPS와 SERVER_PORT를 확인하여 HTTPS 사용 여부를 판단하는 함수
function is_https() {
    // HTTPS 서버 변수가 존재하고 문자열이 비어 있지 않은 경우
    if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS'])) {
        return true;
    }

    // HTTPS 서버 변수가 없거나 문자열이 비어 있는 경우 기본 HTTPS 포트인 443으로 확인
    if (isset($_SERVER['SERVER_PORT']) && (string) $_SERVER['SERVER_PORT'] === '443') {
        return true;
    }

    return false;
}
/*
주의: $_SERVER['HTTPS']와 $_SERVER['SERVER_PORT']를 이용한 HTTPS 확인은
     PHP가 전달받은 서버 정보를 기준으로 합니다.
     로드 밸런서나 리버스 프록시를 사용하는 환경에서는
     실제 클라이언트의 HTTPS 접속 여부와 PHP가 인식하는 요청 정보가 다를 수 있습니다.
*/

// 1. 프로토콜 확인: HTTPS 사용 여부에 따라 http 또는 https 결정
$protocol = is_https() ? 'https' : 'http';

// 2. hostname + port: 호스트 이름과 포트 정보를 가져오기
$host = $_SERVER['HTTP_HOST'];

// 3. pathname + query: 요청된 경로(pathname)와 쿼리 문자열(query) 가져오기
$uri = $_SERVER['REQUEST_URI'];

// 4. 조각들을 하나로 합쳐서 전체 URL 완성
$current_url = $protocol . '://' . $host . $uri;

echo $current_url;
// 출력: https://www.example.com/products/list?page=1
/* 전체 URL 예: https://www.example.com:8080/products/list?page=1#review */

// HTTPS와 SERVER_PORT를 확인하여 HTTPS 사용 여부를 판단하는 함수
function is_https() {
    // HTTPS 서버 변수가 존재하고 문자열이 비어 있지 않은 경우
    if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS'])) {
        return true;
    }

    // HTTPS 서버 변수가 없거나 문자열이 비어 있는 경우 기본 HTTPS 포트인 443으로 확인
    if (isset($_SERVER['SERVER_PORT']) && (string) $_SERVER['SERVER_PORT'] === '443') {
        return true;
    }

    return false;
}
/*
주의: $_SERVER['HTTPS']와 $_SERVER['SERVER_PORT']를 이용한 HTTPS 확인은
     PHP가 전달받은 서버 정보를 기준으로 합니다.
     로드 밸런서나 리버스 프록시를 사용하는 환경에서는
     실제 클라이언트의 HTTPS 접속 여부와 PHP가 인식하는 요청 정보가 다를 수 있습니다.
*/

// protocol
$protocol = is_https() ? 'https' : 'http';
echo $protocol;
// "https"

// hostname + port
echo $_SERVER['HTTP_HOST'];
// "www.example.com:8080"

// hostname
echo $_SERVER['SERVER_NAME'];
// "www.example.com"

// port
echo $_SERVER['SERVER_PORT'];
// "8080"

// protocol + hostname + port
$origin = $protocol . '://' . $_SERVER['HTTP_HOST'];
echo $origin;
// "https://www.example.com:8080"

// pathname + query
echo $_SERVER['REQUEST_URI'];
// "/products/list?page=1"

// query
echo $_SERVER['QUERY_STRING'];
// "page=1"

// fragment
// PHP에서는 현재 URL의 fragment를 가져올 수 없습니다.