- 请向下滚动到我标记 PHP -
的位置更详细地解释。
我制作了一张Leaflet地图,在该地图中我想加载我自己的位置。
这是我在Javascript中的代码,但这是@Pocketsand之类的问题,我已经讨论过了。然后向下滚动到PHP代码,看看是否可以通过浏览器获取IP地址。
$part_content = "<div id=\"mapid\"></div>";
//.setView([".$longitude.", ".$latitude."], ".$zoom_factor.");
$part_content .= "<script>
var map = L.map('mapid').fitWorld();
L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', {
maxZoom: 18,
attribution: 'Map data © <a href=\"http://openstreetmap.org\">OpenStreetMap</a> contributors, ' +
'<a href=\"http://creativecommons.org/licenses/by-sa/2.0/\">CC-BY-SA</a>, ' +
'Imagery © <a href=\"http://mapbox.com\">Mapbox</a>',
id: 'mapbox.streets'
}).addTo(map);
function onLocationFound(e) {
var radius = e.accuracy / 2;
L.marker(e.latlng).addTo(map)
.bindPopup(\"You are within \" + radius + \" meters from this point\").openPopup();
L.circle(e.latlng, radius).addTo(map);
}
function onLocationError(e) {
alert(e.message);
}
map.on('locationfound', onLocationFound);
map.on('locationerror', onLocationError);
map.locate({setView: true, maxZoom: 16});
</script>";
它与this地图源代码中的代码相同。
当我访问Firefox时,它部分工作,并且在别人的计算机上工作正常,当我在计算机上时,我从我向您展示的图像中得到错误。
所以我无法在我的电脑上找到我自己的位置,因为在谷歌地图中它完美运行,我的扩展也似乎没有阻止那部分。
PHP:
基本上这个:
$ip = !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
给我一个随机的IP,因为HTTP_X_FORWARDED_FOR
和REMOTE_ADDR
给了我正确的IP,但是当我从不同的IP地址然后使用本地的IP时这不是...这就是为什么我检查如果代理不是空的。
这是跟踪器的完整php代码:
$ip = !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
$url = "http://freegeoip.net/json/$ip";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
$data = curl_exec($ch);
curl_close($ch);
if ($data) {
$location = json_decode($data);
$longitude = $location->longitude;
$latitude = $location->latitude;
$longitude = str_replace(",", ".", $longitude);
$latitude = str_replace(",", ".", $latitude);
}
我目前的问题是:
$ip = $_SERVER['HTTP_CLIENT_IP'] ? $_SERVER['HTTP_CLIENT_IP'] : ($_SERVER['HTTP_X_FORWARDED_FOR'] ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']);
哪个获得了正确的IP地址,但它几乎可以获得IP主机位置。这不是我的意图,我打算通过目前无效的IP地址获取客户端位置。
我尝试过并试过,但似乎无法弄清楚这一点,并希望你们了解更多。
提前致谢!
答案 0 :(得分:1)
我猜您没有访问错误消息中的URL?这是一个Chrome安全问题,尝试在本地网络服务器上运行或在远程服务器上获取https证书。
Chrome安全团队和我建议,对于新的,特别是 强大的网络平台功能,浏览器厂商倾向于制作 默认情况下,该功能仅适用于安全起源。
[...]
说明:
“安全起源”是至少与以下其中一项匹配的起源 (方案,主机,端口)模式:
(https,*,*)
(wss,*,*)
(*,localhost,)(,127/8,*)
(*,:: 1/128,*)
(文件,*, - )
(chrome-extension,*, - )
此列表可能不完整,可能需要更改。
来源:https://www.chromium.org/Home/chromium-security/prefer-secure-origins-for-powerful-new-features
答案 1 :(得分:1)
要获取客户端公共IP地址,请在PHP 5.3或更高版本中使用:
<?php
$ip = getenv('HTTP_CLIENT_IP')?:
getenv('HTTP_X_FORWARDED_FOR')?:
getenv('HTTP_X_FORWARDED')?:
getenv('HTTP_FORWARDED_FOR')?:
getenv('HTTP_FORWARDED')?:
getenv('REMOTE_ADDR');
?>
如果不起作用,请使用https://geoip-db.com
等外部提供商JSON-P 回调示例:
<?php
$jsonp = file_get_contents('https://geoip-db.com/jsonp');
$data = jsonp_decode($jsonp);
print $data->IPv4 . '<br>';
print $data->country_code . '<br>';
print $data->country_name . '<br>';
print $data->state . '<br>';
print $data->city . '<br>';
print $data->postal . '<br>';
print $data->latitude . '<br>';
print $data->longitude . '<br>';
// Strip callback function name and parenthesis
function jsonp_decode($jsonp) {
if($jsonp[0] !== '[' && $jsonp[0] !== '{') {
$jsonp = substr($jsonp, strpos($jsonp, '('));
}
return json_decode(trim($jsonp,'();'));
}
?>
还有 JSON 示例:
<?php
$json = file_get_contents('https://geoip-db.com/json');
$data = json_decode($json);
print $data->country_code . '<br>';
print $data->country_name . '<br>';
print $data->state . '<br>';
print $data->city . '<br>';
print $data->postal . '<br>';
print $data->latitude . '<br>';
print $data->longitude . '<br>';
print $data->IPv4 . '<br>';
?>
答案 2 :(得分:0)
我没有使用PHP函数,而是使用了leaflet
函数,它通过浏览器跟踪用户。
使用图书馆:leaflet.locate
然后我可以使用:
// create control and add to map
var lc = L.control.locate().addTo(map);
// request location update and set location
lc.start();
但这不是我的代码的PHP部分的答案,即使这个传单函数现在也有效。
遗憾的是,如果服务器位于另一个地方,PHP部分无法通过IP找到确切的地址,但通过浏览器执行此操作的传单方式确实有效。希望你们能在这些答案中找到它们。