통계 프로그램 만들고있는데 full url 저장..

통계 프로그램 만들고있는데 full url 저장..

QA

통계 프로그램 만들고있는데 full url 저장..

본문

안녕하세요 현재  ai 와 통계 프로그램을 만들고 있습니다

핵심 코드는 아래와 같은데요.. 모바일 접속시에는 유입경로를 파라미터를 포함한 주소를 받고 싶은데..

그게 잘 안되네요 ㅠㅠ

 


<?php
if (!defined('_GNUBOARD_')) exit;
// --------------------------------------------------------------------------------
// [데이터 준비] 일반 접속 vs 외부 트래킹 접속 구분
// --------------------------------------------------------------------------------
if (defined('G5_IS_TRACKING_SCRIPT')) {
    // 외부 스크립트(tracker.php)를 통해 호출된 경우 파라미터로 전달받음
    $an_current_url = isset($_GET['url']) ? $_GET['url'] : '';
    
    // 만약 파라미터로 URL이 안 넘어왔다면 서버 변수로 추정 시도
    if (!$an_current_url) {
        $protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ? "https://" : "http://";
        $an_current_url = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    }
    $an_referer_raw = isset($_GET['ref']) ? $_GET['ref'] : '';
    // [추가] 화면 정보 받기
    $an_screen_width = isset($_GET['w']) ? (int)$_GET['w'] : 0;
    $an_screen_height = isset($_GET['h']) ? (int)$_GET['h'] : 0;
    $an_pixel_ratio = isset($_GET['r']) ? (float)$_GET['r'] : 1.0;
} else {
    // 일반 접속 (그누보드 페이지 내 실행)
    
    // 1. 프로토콜 확인 (로드밸런서/프록시 환경 고려)
    $is_https = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on');
    if (!$is_https && isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
        $is_https = true;
    }
    $protocol = $is_https ? "https://" : "http://";
    // 2. 포트 확인 (표준 포트가 아닌 경우 포함)
    $port = "";
    if (isset($_SERVER['SERVER_PORT'])) {
        if (($is_https && $_SERVER['SERVER_PORT'] != '443') || (!$is_https && $_SERVER['SERVER_PORT'] != '80')) {
            $port = ":" . $_SERVER['SERVER_PORT'];
        }
    }
    // 3. 전체 URL 조립
    $an_current_url = $protocol . $_SERVER['HTTP_HOST'] . $port . $_SERVER['REQUEST_URI'];
    
    $an_referer_raw = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
    $an_screen_width = 0;
    $an_screen_height = 0;
    $an_pixel_ratio = 1.0;
}
// --------------------------------------------------------------------------------
// [필터링 설정] 불필요한 로그 수집 방지
// --------------------------------------------------------------------------------
if (defined('G5_IS_ADMIN') || strpos($_SERVER['REQUEST_URI'], '/adm/') !== false) return;
if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'GET') return;
if (!defined('G5_IS_TRACKING_SCRIPT')) {
    if (isset($_SERVER['HTTP_ACCEPT']) && strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false) return;
}
$exclude_patterns = array(
    '.css', '.js', '.png', '.jpg', '.gif', '.ico', 
    'ajax', '/rb/', 'rb.css', 'rb.config',
    'wcslog.js', 'favicon', 'tracker.php'
);
foreach ($exclude_patterns as $pattern) {
    if (stripos($an_current_url, $pattern) !== false) return;
}
// --------------------------------------------------------------------------------
// [User-Agent 분석 함수]
// --------------------------------------------------------------------------------
function get_user_agent_info() {
    $agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
    $info = array('device' => 'PC', 'os' => 'Unknown', 'browser' => 'Unknown');
    // 1. 기기 구분
    if (preg_match('/(iPhone|Android|Mobile|iPod|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera Mini|CriOS|Mobile Safari)/i', $agent)) {
        $info['device'] = 'Mobile';
    }
    // 2. 운영체제 (OS)
    if (preg_match('/android/i', $agent)) {
        $info['os'] = 'Android';
    } elseif (preg_match('/iphone/i', $agent)) {
        $info['os'] = 'iOS (iPhone)';
    } elseif (preg_match('/ipad/i', $agent)) {
        $info['os'] = 'iOS (iPad)';
        $info['device'] = 'Tablet';
    } elseif (preg_match('/macintosh|mac os/i', $agent)) {
        $info['os'] = 'Mac OS';
    } elseif (preg_match('/windows|win32/i', $agent)) {
        $info['os'] = 'Windows';
    } elseif (preg_match('/linux/i', $agent)) {
        $info['os'] = 'Linux';
    }
    // 3. 브라우저
    if (preg_match('/KAKAOTALK/i', $agent)) {
        $info['browser'] = 'KakaoTalk InApp';
    } elseif (preg_match('/NAVER/i', $agent)) {
        $info['browser'] = 'Naver InApp';
    } elseif (preg_match('/SamsungBrowser/i', $agent)) {
        $info['browser'] = 'Samsung Internet';
    } elseif (preg_match('/Whale/i', $agent)) {
        $info['browser'] = 'Naver Whale';
    } elseif (preg_match('/Edg/i', $agent)) {
        $info['browser'] = 'Edge';
    } elseif (preg_match('/Chrome/i', $agent)) {
        $info['browser'] = 'Chrome';
    } elseif (preg_match('/Safari/i', $agent)) {
        $info['browser'] = 'Safari';
    } elseif (preg_match('/Firefox/i', $agent)) {
        $info['browser'] = 'Firefox';
    } elseif (preg_match('/MSIE|Trident/i', $agent)) {
        $info['browser'] = 'Internet Explorer';
    }
    // 모델명 추출 시도 (안드로이드)
    if ($info['os'] == 'Android') {
        if (preg_match('/\bAndroid\s+[^;]+;\s*([^;)]+)/', $agent, $matches)) {
            $model = trim($matches[1]);
            if (!preg_match('/^[a-z]{2}-[a-z]{2}$/i', $model)) {
               $info['os'] .= ' (' . $model . ')';
            }
        }
    }
    return $info;
}
// --------------------------------------------------------------------------------
// [로그 수집 시작] 
// --------------------------------------------------------------------------------
if (!get_session('ss_analytics_id')) {
    set_session('ss_analytics_id', session_id());
}
$an_session_id = get_session('ss_analytics_id');
$an_ip = $_SERVER['REMOTE_ADDR'];
$an_mb_id = isset($member['mb_id']) ? $member['mb_id'] : '';
$an_event_type = 'view'; // 기본값
// 기기 정보 가져오기
$ua_info = get_user_agent_info();
$an_device = $ua_info['device'];
$an_os = $ua_info['os'];
$an_browser = $ua_info['browser'];
// 유입 경로 처리
$an_referer = '';
if ($an_referer_raw) {
    if (strpos($an_referer_raw, $_SERVER['HTTP_HOST']) === false) {
        $an_referer = $an_referer_raw;
    }
}
// --------------------------------------------------------------------------------
// [전환(구매/가입) 체크 및 중복 방지 로직]
// --------------------------------------------------------------------------------
// 1. 구매 체크
// 조건: orderinquiryview.php + od_id 존재 + new=1 존재 (신규 주문 완료 URL 특징)
if (strpos($an_current_url, 'orderinquiryview.php') !== false 
    && strpos($an_current_url, 'od_id') !== false 
    && strpos($an_current_url, 'new=1') !== false) {
    
    // [중복 방지] 해당 주문번호로 이미 기록된 구매가 있는지 확인
    $od_id_val = '';
    // URL에서 od_id 값 추출
    if (preg_match('/od_id=([^&]+)/', $an_current_url, $matches)) {
        $od_id_val = $matches[1];
    }
    if ($od_id_val) {
        // DB에서 같은 주문번호의 purchase 이벤트 조회
        $chk_sql = " SELECT id FROM g5_custom_analytics 
                     WHERE event_type = 'purchase' 
                     AND page_url LIKE '%od_id=" . addslashes($od_id_val) . "%' 
                     LIMIT 1 ";
        $chk_row = sql_fetch($chk_sql);
        
        // 기존 기록이 없을 때만 구매로 인정
        if (!$chk_row['id']) {
            $an_event_type = 'purchase';
        }
    }
}
// 2. 가입 체크
// 조건: register_result.php (가입 완료)
else if (strpos($an_current_url, 'register_result.php') !== false) {
    // [중복 방지] 해당 세션에서 이미 가입 처리가 되었는지 확인
    $chk_sql = " SELECT id FROM g5_custom_analytics 
                 WHERE event_type = 'signup' 
                 AND session_id = '{$an_session_id}' 
                 LIMIT 1 ";
    $chk_row = sql_fetch($chk_sql);
    
    if (!$chk_row['id']) {
        $an_event_type = 'signup';
    }
}
// DB 저장 (화면 정보 컬럼 추가)
// page_url에 전체 URL이 저장되도록 $an_current_url 사용
$sql = " INSERT INTO g5_custom_analytics
            SET session_id = '{$an_session_id}',
                mb_id = '{$an_mb_id}',
                ip_addr = '{$an_ip}',
                page_url = '" . addslashes($an_current_url) . "',
                referer = '" . addslashes($an_referer) . "',
                event_type = '{$an_event_type}',
                device = '{$an_device}',
                os = '{$an_os}',
                browser = '{$an_browser}',
                screen_width = '{$an_screen_width}',
                screen_height = '{$an_screen_height}',
                pixel_ratio = '{$an_pixel_ratio}',
                reg_date = '" . G5_TIME_YMDHIS . "' ";
sql_query($sql, false);
?>

 

이 질문에 댓글 쓰기 :

답변 3

모바일 유입코드 어떻게 나오는데요?

디비 기록엔 뭘로 나와요?

네이버의 경우에 그냥
https://m.search.naver.com/

이렇게만 나오네요 ㅠㅠ 구글도 그러고 빙도 그래요 파라미터 값이 나와야 하는데 ㅠㅠ 난감하네요
파워링크 광고중인데 부정클릭자들 잡기 위함도 있고, 어디서 어떤 키워드로 유입이 되는지 보고 싶은데 어렵네요

일반적인 사이트의 경우는 파라미터 값까지 나옵니다.
구글 네이버 등 검색엔진에서는 일부러 검색어를 숨긴다고 합니다.
엄격해진 개인정보 보호 정책 때문 이라고 합니다. ㅜㅜ
방법은 없다고 합니다.
서치콘솔이니 이런곳에서 대랙적으로 파악을 해야 한다고 합니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 129,664 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT