0

让我通过一个例子来解释:-

假设http://www.washingtontimes.com/news/2012/sep/18/pentagon-stops-training-partnering-afghan-troops-b/是用户提交的 URL,现在我需要的是php 或 javascript 或任何其他 web 脚本语言中的方法,它可以为我提供与上述 url 对应的位置,例如该网站托管在哪个国家/地区,因为在这种情况下结果应该是“美国”。它是由许多网站完成的,例如http://www.site24x7.com,但我需要一个代码来做到这一点

4

2 回答 2

1

您可以这样做,从 url 获取主机名,然后使用 gethostbyname() 获取 IP,然后从 whois 站点获取有关 IP 的一些信息。

<?php 
$url  = 'http://www.washingtontimes.com/news/2012/sep/18/pentagon-stops-training-partnering-afghan-troops-b/';

$host = parse_url($url,PHP_URL_HOST);
$ip = gethostbyname($host);
$info = get_ip_info($ip);

$result = array('host'=>$host, 'ip'=>$ip, 'info'=>$info);

print_r($result);
/*
Array
(
    [host] => www.washingtontimes.com
    [ip] => 38.118.71.70
    [info] => Array
        (
            [host] => theconservatives.com
            [country] => United States
            [country_code] => USA
            [continent] => North America
            [region] => Virginia
            [latitude] => 38.9687
            [longitude] => -77.3411
            [organization] => Cogent Communications
            [isp] => Cogent Communications
        )

)
*/
echo $result['info']['country']; //United States

function get_ip_info($ip = NULL){
    if(empty($ip)) $ip = $_SERVER['REMOTE_ADDR'];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,'http://www.ipaddresslocation.org/ip-address-locator.php');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_POST,true);
    curl_setopt($ch, CURLOPT_POSTFIELDS,array('ip'=>$ip));
    $data = curl_exec($ch);
    curl_close($ch);
    preg_match_all('/<i>([a-z\s]+)\:<\/i>\s+<b>(.*)<\/b>/im',$data,$matches,PREG_SET_ORDER);
    if(count($matches)==0)return false;
    $return = array();
    $labels = array(
    'Hostname'          => 'host',
    'IP Country'        => 'country',
    'IP Country Code'   => 'country_code',
    'IP Continent'      => 'continent',
    'IP Region'         => 'region',
    'IP Latitude'       => 'latitude',
    'IP Longitude'      => 'longitude',
    'Organization'      => 'organization',
    'ISP Provider'      => 'isp');
    foreach($matches as $info){
        if(isset($info[2]) && !is_null($labels[$info[1]])){
            $return[$labels[$info[1]]]=$info[2];
        }
    }

    return (count($return))?$return:false;
}
?>
于 2012-09-18T14:47:21.437 回答
0

您需要的是内置在 PHP 中的。使用 gethostbyname 方法查找 IP 地址,然后使用免费 API 查找位置(例如 MaxMind) PHP 中还有一个 parse_url 方法可以帮助您从 URL 获取实际域名。当有更安全的方法可用时,不要使用 shell_exec。

于 2012-09-18T14:40:58.207 回答