Php跟踪自己的位置提供随机IP

时间:2017-04-25 13:31:44

标签: php maps leaflet

Map error

- 请向下滚动到我标记 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 &copy; <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_FORREMOTE_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_FORWARDE‌​D_FOR'] ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']);

哪个获得了正确的IP地址,但它几乎可以获得IP主机位置。这不是我的意图,我打算通过目前无效的IP地址获取客户端位置。

我尝试过并试过,但似乎无法弄清楚这一点,并希望你们了解更多。

提前致谢!

3 个答案:

答案 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找到确切的地址,但通过浏览器执行此操作的传单方式确实有效。希望你们能在这些答案中找到它们。