통계 프로그램 만들고있는데 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
모바일 유입코드 어떻게 나오는데요?
디비 기록엔 뭘로 나와요?
일반적인 사이트의 경우는 파라미터 값까지 나옵니다.
구글 네이버 등 검색엔진에서는 일부러 검색어를 숨긴다고 합니다.
엄격해진 개인정보 보호 정책 때문 이라고 합니다. ㅜㅜ
방법은 없다고 합니다.
서치콘솔이니 이런곳에서 대랙적으로 파악을 해야 한다고 합니다.
구글은 오래 전부터 안왔고, 네이버도 어느 순간부터인가 안오더라구요.
답변을 작성하시기 전에 로그인 해주세요.