Originalmente inviato da
karl94
Come ti ha già scritto Filsil, nelle le richieste server to server CloudFlare non c'entra nulla: la richiesta parte dai server AlterVista e arriva direttamente a destinazione.
Puoi riportare il codice problematico e l'indirizzo di una pagina di esempio in cui è possibile vederlo in esecuzione?
Ma se una semplice funzione come:
Codice PHP:
echo 'Il tuo IP è: ' . $_SERVER['REMOTE_ADDR'] . '<br />';
restituisce un IP di Cloudfare perché appunto, tale servizio agisce come proxy, come si può sostenere quanto sopra?
Mentre per ottenere l'IP di un utente DEVO fare così:
Codice PHP:
if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] != '' )
{
echo 'Ecco il tuo IP: ' . $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'] . '<br />';
}
Inoltre, come fa allora Cloudfare, senza agire da proxy, ad immagazzinare nella cache del browser dell'utente che visita per la prima volta un sito, dei contenuti che poi ripresenta, SENZA richiedere una nuova ricarica dei medesimi, quando lo stesso utente visita un'altra pagina dello stesso sito?
Se mi spiegate questo ve ne sarei grato?
Poi ecco una parte della classe che non funziona (causa appunto Cloudfare) poiché non riesce a connettersi alla API, http://ip-api.com/json/ che prima dell'intervento di Cloudfare funzionava benissimo.
Codice PHP:
class Visitors
{
public $server_time;
public $server_date;
public $user_ip;
public $user_os;
public $user_browser;
public $userAgent;
public $statusResponseAPI;
public $timeZone;
public $userCountry;
public $userCountryCode;
public $userCity;
public $userStateOfRegion;
public $latitude;
public $longitude;
public $zip;
public $region;
public $IP_address_used_for_query;
public $ISP;
public $ORG;
public $AS;
public $subdomain;
public $API;
public function __construct()
{
$this->init();
}
public function init()
{
$this->server_time = '';
$this->server_date = '';
$this->user_ip = '';
$this->user_os = '';
$this->user_browser = '';
$this->userAgent = '';
$this->statusResponseAPI = '';
$this->timeZone = '';
$this->userCountry = '';
$this->userCountryCode = '';
$this->userCity = '';
$this->userStateOfRegion = '';
$this->latitude = '';
$this->longitude = '';
$this->zip = '';
$this->region = '';
$this->IP_address_used_for_query = '';
$this->ISP = '';
$this->ORG = '';
$this->AS = '';
$this->subdomain = '';
// see here for info about this API: http://ip-api.com/docs/api:json
$this->API = 'http://ip-api.com/json/{IP}';
}
public function getVisitorInfo($httpUserAgent)
{
// set the properties:
// retrieve these thru some PHP predefined functions
$this->setUserIp();
$this->setServerDate();
$this->setServerTime();
$this->setUserOs($httpUserAgent);
$this->setUserBrowser($httpUserAgent);
$this->setUserAgent($httpUserAgent);
$API = str_replace('{IP}', $this->user_ip, $this->API);
$response = $this->fetch($API);
// decode the JSON into an associative array, setting the option to true
$data = json_decode($response, true);
# This will print out the contents of the array in a nice readable format.
# echo '<pre>' . print_r($data, true) . '</pre>';
// set these properties:
// retrieve these thru the API instead
$this->setStatus($data['status']);
$this->setTimeZone($data['timezone']);
$this->setUserCountry($data['country']);
$this->setUserCountryCode($data['countryCode']);
$this->setUserCity($data['city']);
$this->setUserStateOfRegion($data['regionName']);
$this->setLatitude($data['lat']);
$this->setLongitude($data['lon']);
$this->setZip($data['zip']);
$this->setRegion($data['region']);
$this->setIP_address_used_for_query($data['query']);
$this->setISP($data['isp']);
$this->setORG($data['org']);
$this->setAS($data['as']);
}
public function fetch($API)
{
if ( function_exists('curl_init') )
{
// use cURL to fetch data
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $API);
// return the transfer instead of outputting it out directly.
// if deactivated (with 0 instead of 1) you see the json from the API
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// execute
$response = curl_exec($ch);
// close cURL resource, and free up system resources
curl_close ($ch);
}
else if ( ini_get('allow_url_fopen') )
{
// fall back to fopen()
$response = file_get_contents($API, 'r');
}
return $response;
}
/**
* @param $user_ip
*/
public function setUserIp()
{
$this->user_ip = self::getRealIpAddr();
}
/**
* @return
*/
public function getUserIp()
{
return $this->user_ip;
}
/**
* See above
*/
public function getRealIpAddr()
{
if ( isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] != '' )
{
return $_SERVER['REMOTE_ADDR'];
}
// Fall back to HTTP_CLIENT_IP
else if ( isset($_SERVER['HTTP_CLIENT_IP']) && $_SERVER['HTTP_CLIENT_IP'] != '' )
{
return $_SERVER['HTTP_CLIENT_IP'];
}
// Only way to get the real IP address of a visitor, if you use
// the Cloudfare service.
else if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] != '' )
{
return $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
// Nothing? Return false
return false;
}
etc...
Il metodo, getRealIpAddr() , che deve recuperare l'IP dell'utente DEVE essere scritto come l'ho modificato qui sopra, se si vuole usare Cloudfare.
In ogni caso ribadisco che PRIMA dell'attivazione di Cloudfare, la API andava perfettamente, ed in locale infatti va benissimo.
Inoltre usando una API similare, ma meno esatta nel ridare le info per il Geocoding che necessito, come questa http://ipinfo.io/developers ecco che anche con Cloudfare attivo, tutto è ok.
Ora ho provato a disattivare Cloudfare, per vedere se la API torna a funzionare.
Se è cosi, allora il problema sta appunto in Cloudfare, altrimenti è un problema "improvviso" dei server DNS di altervista.
Attendo qualche info.
Ciao e grazie.