userAgent()); return preg_match('/mobile|android|iphone|ipad|ipod|windows phone|harmonyos/', $ua) ? 'mobile' : 'pc'; } public function domain(Request $request): string { foreach ([(string) $request->header('Origin'), (string) $request->header('Referer')] as $url) { $host = parse_url($url, PHP_URL_HOST); if (is_string($host) && $host !== '') { return strtolower($host); } } return strtolower((string) $request->getHost()); } public function location(Request $request): array { // 优先读取 CDN/网关在边缘完成的 IP 归属地;没有时保留空值,避免登录依赖外部接口。 return [ 'country' => mb_substr((string) ($request->header('CF-IPCountry') ?: $request->header('X-IP-Country', '')), 0, 128), 'region' => mb_substr((string) $request->header('X-IP-Region', ''), 0, 128), 'city' => mb_substr((string) $request->header('X-IP-City', ''), 0, 128), ]; } }