WordPress+Nginx+proxyリアルIP取得


WordPressがNginxでproxyエージェントのバックエンドとして実行されている場合、WPはデフォルトで$_を取得します.SERVER['rmote_addr']のIPアドレス.実はこのIPアドレスはフロントエンドのNginxのIPアドレスで、間違っています.WordPressで実際のIPアドレスを取得するにはどうすればいいですか?方法は簡単で、いくつかありますが、次の2つについて説明します.
まず、Nginx Proxyを実行するものをサーバAとし、WordPressを実行するものをサーバB(Nginx、Apache、Lighttpd、IISなど)と定義.
1.HttpRealIpModuleモジュールの使用:HTTP_X_REAL_IP. HttpRealIpModuleモジュールはデフォルトではNginxにインストールされません.Nginxを構成し、--with-http_を追加する必要があります.realip_moduleオプション再コンパイルインストールNginx.
次に、Nginx Proxyフロントエンドに:proxy_を追加します.set_header  X-Real-IP        $remote_addr;
再ロードNginxの構成:/usr/local/nginx/sbin/nginx-s reload
このとき、お客様の実際のIPは$_に保存されます.SERVER['HTTP_X_REAL_IP']変数でphpプログラムを使用した場合、出力:
echo $_SERVER['HTTP_X_REAL_IP'];
ユーザの実際のIPが得られる.
WordPressルートの下のwp-configを修正する.php:2行目にif(isset($_SERVER['HTTP_X_REAL_IP']){$_SERVER['REMOTE_ADDR']=$_SERVER['HTTP_X_REAL_IP']];
保存終了、完了!
2.HTTP_を使うX_FORWARDED_FOR変数
他のモジュールを取り付ける必要はありません.
次に、Nginx Proxyフロントエンド、すなわちサーバAに:proxy_を追加するset_header X-Forwarded-For  $remote_addr;
再ロードNginxの構成:/usr/local/nginx/sbin/nginx-s reload
この場合、顧客の実際のIPは$_に保存されます.SERVER['HTTP_X_FOrWARDED_FOR']変数では、
WordPressルートの下のwp-configを修正する.php:2行目に追加:
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $_SERVER['REMOTE_ADDR'] = $ips[0]; }
保存終了、完了!
今WPに新しいコメントを追加してみて、実際のIPを使っているのではないでしょうか.
WordPressでは、この方法を使用することができるだけでなく、一反三を挙げる、この方法は他の類似の環境に使用することができる.
phpプログラムでこのように出力された場合:
print_r($_SERVER);
?>
次の図に似たような情報が得られます.
図中、REMOTE_ADDRは、フロントエンドエージェントNginx、すなわちサーバAのIPアドレスである.HTTP_X_REAL_IPはユーザの実際のIPアドレスであり、これは有用である.HTTP_X_FORWARDED_FORもユーザの実際のIPアドレスであり、これは有用である.本当に何度もジャンプすると、ここでは「,」で区切られたIPアドレスのリストが得られる.
関連情報:
Nginx+Memcached高速最適化DedeCMSのプログラム修正Nginx-JSP-Tomcat-PHP
Nginx統合Tomcat Nginxサービス管理スクリプトWordPress自動キーワード(語)外鎖BlogMechanics KeywordLink,SEO最適化プラグイン変換元:http://admclub.com/view/wordpress-nginx-proxy%E5%8F%96%E5%BE%97%E7%9C%9F%E5%AE%9Eip
Stackflow返信:
http://stackoverflow.com/questions/3003145/how-to-get-client-ip-address
Whatever you do, make sure not to trust data sent from the client.  $_SERVER['REMOTE_ADDR'] contains the real IP address of the connecting party. That is the most reliable value you can find.
However, they can be behind a proxy server in which case the proxy may have set the $_SERVER['HTTP_X_FORWARDED_FOR'] , but this value is easily spoofed. For example, it can be set by someone without a proxy, or the IP can be an internal IP from the LAN behind the proxy.
This means that if you are going to save the  $_SERVER['HTTP_X_FORWARDED_FOR'] , make sure youalso save the  $_SERVER['REMOTE_ADDR']  value. E.g. by saving both values in different fields in your database.
基本的なNginx構成:張宴から転送:
user  www www;worker_processes 10;#error_log  logs/error.log;#error_log  logs/error.log  notice;#error_log  logs/error.log  info;#pid        logs/nginx.pid;#最大ファイル記述子worker_rlimit_nofile 51200;events {      use epoll;      worker_connections 51200;}http {      include       conf/mime.types;      default_type  application/octet-stream;      keepalive_timeout 120;      tcp_nodelay on;      upstream  www.s135.com  {              server   192.168.1.2:80;              server   192.168.1.3:80;              server   192.168.1.4:80;              server   192.168.1.5:80;      }      upstream  blog.s135.com  {              server   192.168.1.7:8080;              server   192.168.1.7:8081;              server   192.168.1.7:8082;      }      server      {              listen  80;              server_name  www.s135.com;              location/{                       proxy_pass        http://www.s135.com;                       proxy_set_header   Host             $host;                       proxy_set_header   X-Real-IP        $remote_addr;                       proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;              }              log_format  www_s135_com  '$remote_addr - $remote_user [$time_local] $request '                                '"$status"$body_bytes_sent "$http_referer"'                                '"$http_user_agent""$http_x_forwarded_for"';              access_log  /data1/logs/www.log  www_s135_com;      }      server      {              listen  80;              server_name  blog.s135.com;              location/{                       proxy_pass        http://blog.s135.com;                       proxy_set_header   Host             $host;                       proxy_set_header   X-Real-IP        $remote_addr;                       proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;              }              log_format  blog_s135_com  '$remote_addr - $remote_user [$time_local] $request '                                '"$status"$body_bytes_sent "$http_referer"'                                '"$http_user_agent""$http_x_forwarded_for"';              access_log  /data1/logs/blog.log  blog_s135_com;      }}
このとき、クライアントIPを取得する方法は以下の通りである.
function getIP() {
    if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        return $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else if(isset($_SERVER['HTTP_X_REAL_IP'])) {
        return $_SERVER['HTTP_X_REAL_IP']);
    } else if(isset($_SERVER['REMOTE_ADDR'])) {
        return $_SERVER['REMOTE_ADDR']);
    } else {
        return '';
    }
}