Как я могу получить IP-адрес пользователя при использовании CloudFlare и Maxoind GeoIP с mod_geoip? - PullRequest
4 голосов
/ 24 июня 2011

CloudFlare предоставляет страну пользователя с исходного IP-адреса, но мне нужно местоположение на уровне города, поэтому я добавил MaxMind GeoCityLite, используя скрипт Apache mod_geoip.

Теперь проблема заключается в том, чтобы получить IP-адрес в php.переменная, я использую что-то вроде

$country = apache_note("GEOIP_COUNTRY_CODE");

Это здорово, но IP mod_geoip использует DNS CloudFlare, а не конечного пользователя.CloudFlare предлагает серверную переменную HTTP_CF_CONNECTING_IP для использования IP-адреса конечного пользователя, но как мне использовать переменную THAT / IP в mod_geoip?

Можно ли это сделать с помощью нескольких строк в htaccess?

РедактироватьУ меня есть обходной путь, использующий php API для geoip, который прост, но тесты, использующие поиск apache php api, намного лучше, поэтому я бы лучше нашел это решение.

Ответы [ 4 ]

17 голосов
/ 19 июля 2012

сделайте это прежде, чем позвоните в geoip:

$_SERVER['REMOTE_ADDR'] = isset($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_IP'] : $_SERVER['REMOTE_ADDR'];
4 голосов
/ 10 марта 2016

У меня были трудности с попыткой заставить работать Larvel TrustedProxy одновременно с CloudFlare и AWS EC2 Elastic Load Balancer.Предполагается, что вы используете только 1 прокси, а не 2, и работает неправильно.Я закончил тем, что просто пропустил весь доверенный прокси-сервер и создал простое MiddleWare, которое при использовании CloudFlare, независимо от того, будет ли перед ним другой балансировщик нагрузки, просто установит правильный IP-адрес и протокол.

CloudFlare передает информацию о клиенте через заголовки HTTP: https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-CloudFlare-handle-HTTP-Request-headers-

Мы берем как клиентский IP, так и клиентский протокол HTTP / HTTPS и устанавливаем его на сервер $ request->Атрибуты.

======

app / Http / Middleware / UseCloudFlareHeaders.php

<?php namespace App\Http\Middleware;

use Closure;

class UseCloudFlareHeaders
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        //if CloudFlare request, set correct protocol and proper client ip address
        $HTTP_CF_VISITOR = $request->server->get('HTTP_CF_VISITOR');
        $HTTP_CF_CONNECTING_IP = $request->server->get('HTTP_CF_CONNECTING_IP');

        if ($HTTP_CF_VISITOR and json_decode($HTTP_CF_VISITOR)->scheme == 'https') {
            $request->server->set('HTTPS', 'on');
        }

        if ($HTTP_CF_CONNECTING_IP) {
            $request->server->set('REMOTE_ADDR', $HTTP_CF_CONNECTING_IP);
        }

        return $next($request);
    }
}

app / Http/Kernal.php

protected $middleware = [
    //add this to your middleware...
    \App\Http\Middleware\UseCloudFlareHeaders::class
];

Если кто-то знает лучший способ сделать это, пожалуйста, сообщите нам.

0 голосов
/ 07 июля 2011

Cloudflare имеет расширение Apache mod_cloudflare (https://github.com/cloudflare/CloudFlare-Tools), которое, как мне кажется, заменяет IP Cloudflare на правильный.

Если он загружен до mod_geoip, он может работать в зависимости от того, как работает mod_geoip.

Для установки mod_cloudflare вам потребуется root-доступ.

0 голосов
/ 24 июня 2011

Чтобы получить IP-адрес пользователя, хранящийся в переменной типа $ip, вы можете сделать это двумя способами:

$ip = $_SERVER['REMOTE_ADDR'];

или

$ip = getenv('REMOTE_ADDR');
...