2011-06-24 42 views
3

CloudFlare從原始IP提供用戶的國家,但我需要在城市級別的位置,所以我使用mod_geoip Apache腳本添加了MaxMind的GeoCityLite。如何在使用CloudFlare和MaxMind的GeoIP和mod_geoip的同時獲取用戶的IP?

現在的問題是要獲得一個PHP變量的IP,我使用的是類似

$country = apache_note("GEOIP_COUNTRY_CODE"); 

這是偉大的,但IP mod_geoip使用的是CloudFlare的DNS,而不是最終用戶。 CloudFlare提供服務器變量HTTP_CF_CONNECTING_IP以使用最終用戶IP,但是如何在mod_geoip中使用THAT變量/ IP?

這可以用htaccess中的幾行來完成嗎?

編輯:我有一個解決方法,使用php API的geoip很容易,但使用api查找php api的基準要好得多,所以我寧願找到這個解決方案。

回答

-3

爲了獲取存儲在像$ip變量用戶的IP地址,就可以做到這一點的幾種方法:

$ip = $_SERVER['REMOTE_ADDR']; 

$ip = getenv('REMOTE_ADDR'); 
+0

不需要在apache conf文件或htaccess中設置。以某種方式使mod_geoip。c使用變量HTTP_CF_CONNECTING_IP而不是REMOTE_ADDR(REMOTE_ADDR此刻讀取DNS代理服務器,HTTP_CF_CONNECTING_IP是解決方法) – hellodolly

0

的CloudFlare有一個Apache擴展mod_cloudflare(https://github.com/cloudflare/CloudFlare-Tools)我相信用正確的Cloudflare IP取代了Cloudflare IP。

如果它在mod_geoip之前加載,它可能會工作取決於mod_geoip的工作方式。

雖然你需要root權限來安裝mod_cloudflare。

16

你打電話之前geoip的做到這一點:

$_SERVER['REMOTE_ADDR'] = isset($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_IP'] : $_SERVER['REMOTE_ADDR']; 
+0

謝謝!這非常有幫助! – ceckoslab

+0

工作完美,我拉着頭髮試圖弄清爲什麼用戶在設置cloudflare後無法登錄。謝謝! –

4

我有困難想同時獲得Larvel TrustedProxy兩者的CloudFlare和AWS的EC2彈性負載均衡共同努力。它假定您只使用1個代理,而不是2個,並且不能正常工作。我最終只是將可信代理的東西全部跳過,並製作一個簡單的MiddleWare,如果使用CloudFlare,無論您在前面有其他Load Balancer,它都會設置正確的IP地址和協議。

的CloudFlare通過HTTP頭將有關客戶的信息:https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-CloudFlare-handle-HTTP-Request-headers-

我們正在對客戶端IP和客戶端HTTP/HTTPS協議和設置,在$請求 - >服務器屬性。

======

應用程序/ HTTP /中間件/ 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); 
    } 
} 

應用程序/ HTTP/Kernal.php

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

如果有人知道更好的做法,請告訴我們。

+0

這使它簡單,不需要TrustedProxy。謝謝。 – Emre

相關問題