如何在PHP中捕获旧谷歌地图URL的重定向新URL?
解决谷歌地图旧URL重定向获取失败的PHP方案
问题根源
之前的脚本无效,大概率是没处理谷歌的重定向逻辑:谷歌会对非浏览器请求做限制,或者需要跟随多次重定向,同时请求头缺失(比如没有模拟浏览器的User-Agent)导致重定向不生效,最终返回原始URL。
正确的PHP实现步骤
1. 用cURL实现完整重定向追踪
cURL能更灵活控制请求参数,确保正确获取最终重定向URL。示例代码:
function getGoogleMapsRedirectUrl($oldUrl) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $oldUrl); // 跟随所有重定向 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 设置最大重定向次数,防止死循环 curl_setopt($ch, CURLOPT_MAXREDIRS, 5); // 模拟浏览器请求头,避免被拦截 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' ]); // 不输出内容,只获取响应信息 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行请求 curl_exec($ch); // 获取最终重定向后的URL $finalUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); curl_close($ch); return $finalUrl; } // 测试示例 $oldUrl = 'http://maps.google.com/maps?ll=50.93554167,4.36341667&t=k&z=19'; $newUrl = getGoogleMapsRedirectUrl($oldUrl); echo $newUrl;
2. 提取海拔参数并建立缩放级别映射
拿到最终URL后,用正则提取其中的海拔数值(比如169m部分):
function extractElevationFromMapsUrl($url) { preg_match('/@[\d.]+,[\d.]+,(\d+)m/', $url, $matches); return isset($matches[1]) ? (int)$matches[1] : null; } // 提取示例 $elevation = extractElevationFromMapsUrl($newUrl); echo '对应海拔:' . $elevation . 'm';
接下来批量测试不同缩放级别(z值)的旧URL,记录每个z对应的海拔,就能建立近似的映射关系(比如z=19对应169m,z=18对应338m,z=17对应676m,大致是2倍递减的关系,具体以实际测试为准)。
注意事项
- 谷歌的重定向规则可能随时间调整,建议用自己的URL样本批量测试,确保映射关系准确
- 如果遇到请求被拦截,可以更换User-Agent字符串,或者添加其他常见请求头(比如Accept-Language)
- 批量处理时建议添加请求间隔,避免触发谷歌的频率限制
内容的提问来源于stack exchange,提问作者Petoetje59
相关产品推荐
相关产品推荐

