1. 程式人生 > >Nginx獲取真實使用者IP

Nginx獲取真實使用者IP

宣告:本文參考http://www.ttlsa.com/nginx/nginx-get-user-real-ip/並做了一些補充講解,希望會更加清晰明瞭~

隨著nginx的迅速崛起,越來越多公司將apache更換成nginx. 同時也越來越多人使用nginx作為負載均衡, 並且代理前面可能還加上了CDN加速,但是隨之也遇到一個問題:nginx如何獲取使用者的真實IP地址,如果後端是apache,請跳轉到<apache獲取使用者真實IP地址>,如果是後端真實伺服器是nginx,那麼繼續往下看。

例項環境:
使用者IP 120.22.11.11
CDN前端 61.22.22.22
CDN中轉 121.207.33.33
公司NGINX前端代理 192.168.50.121(外網121.207.231.22)

1、使用CDN自定義IP頭來獲取

假如說你的CDN廠商使用nginx,那麼在nginx上將$remote_addr賦值給你指定的頭,方法如下:

proxy_set_header remote-user-ip $remote_addr;

//如上,後端將會收到remote_user_ip的http頭,有些人可能會挑錯了,說我設定的頭不是remote-user-ip嗎,怎麼寫成了remote_user_ip,是不是作者寫錯了.請參考文章:<nginx反向代理proxy_set_header自定義header頭無效>

後端PHP程式碼getRemoteUserIP.PHP

<?php
$ip = getenv("HTTP_REMOTE_USER_IP");
echo $ip;   
?>

訪問getRemoteUserIP.php,結果如下:

120.22.11.11 //取到了真實的使用者IP

注:這裡$remote_addr是nginx的變數,一般情況是,是報文傳送方的IP地址,如果傳送方為proxy,那麼這裡就是proxy的ip,而非使用者的真實ip.

注意:這裡面會有一個問題,就是所謂的XFF欺騙,當用戶直接訪問後端的時候,並且他偽造了HTTP報頭REMOTE_USER_IP,那麼後端獲取到的,將是一個虛假的使用者IP,這個時候可能會產生一些安全問題。如果可以,建議的做法是:後端服務不允許對外部使用者訪問,最前端的代理,proxy_set_header xxxxx $remote_addr;這樣就能解決欺騙,因為$remote_addr獲取的是使用者IP資料包中的IP,而非偽造的HTTP報文首部。

2、通過HTTP_X_FORWARDED_FOR獲取IP地址

一般情況下CDN伺服器都會傳送HTTP_X_FORWARDED_FOR頭。而且會用proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

這裡,$proxy_add_x_forwarded_for是一個神奇的變數,假如接收到的報文已經含有X-FORWARDED-FOR首部,那麼nginx將在後面新增上$remote_addr(也就是傳送者的ip地址在最後),因此後端的真實伺服器獲取HTTP_X_FORWARDED_FOR頭,擷取字串第一個不為unkown的IP作為使用者真實IP地址, 例如:

120.22.11.11,  61.22.22.22,  121.207.33.33,192.  168.50.121(使用者IP,CDN前端IP,CDN中轉,公司NGINX代理)

getFor.php

<?php
$ip = getenv("HTTP_X_FORWARDED_FOR");
echo $ip;
?>

訪問getFor.php結果如下:

120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121

如果你是php程式設計師,你獲取第一個不為unknow的ip地址,這邊就是120.22.11.11.

同理,為防止XFF欺騙,除了第一層代理,後面的多禁止普通使用者訪問,第一層代理,用$remote_addr來設定pass X-Forwarded-For即可。

3.使用nginx自帶模組realip獲取使用者IP地址

有些時候,中間或者後端的代理,都要能夠被普通使用者訪問,也或者在nginx日誌中,想讓$remote_adrr配置的格式,能顯示外界使用者的ip,這個時候,就要使用realip模組了。
安裝nginx之時加上realip模組,我的引數如下:

./configure --prefix=/usr/local/nginx-1.4.1 --with-http_realip_module

真實伺服器nginx配置

server {
listen       80;

相關推薦

Nginx獲取真實使用者IP

宣告:本文參考http://www.ttlsa.com/nginx/nginx-get-user-real-ip/並做了一些補充講解,希望會更加清晰明瞭~ 隨著nginx的迅速崛起,越來越多公司將apache更換成nginx. 同時也越來越多人使用nginx作為負載均衡, 並且代理前面可能還

關於nginx獲取真實ip,proxy_set_head設置頭部信息的理解

代理模塊 真是ip 代理模塊 真是ip代理模塊 真是ip代理 $proxy_add_x_forwarded_for $http_x_forwarded_for這兩個的變量的值的區別,就在於,proxy_add_x_forwarded_for 比http_x_forwarded_for 多了一個$rem

rails中使用grape做api,生產環境用nginx做代理,獲取真實ip

Grape官方網站上給出如下的程式碼,但我用了nginx代理,接收到的都是127.0.0.1class API < Grape::API helpers do def logger API.logger end end post '/statuses' do logger.info "#{c

nodejs+nginx獲取真實ip

nodejs + nginx獲取真實ip分為兩部分: 第一、配置nginx; 第二、通過nodejs程式碼獲取; 其他語言也是一樣的,都是配置nginx之後,在http頭裡面獲取“x-fo

php獲取真實登入IP

public static function getIp($type = 0)     {         // return $_SERVER['REMOTE_ADDR'];         $type       =  $type ? 1 : 0;         sta

Linux 獲取登入IP

在linux中有時需要獲得登入者的IP,這裡有兩種方法,先使用who am i 獲取登入IP,然後擷取字串: 1、awk擷取,sed替換 who am i | awk '{print $5}' | sed 's/(//g' | sed 's/)//g' 2、cut 擷取 w

nginx獲取客戶端IP實現

步驟方法: 1、在代理模組新增紅色部份程式碼 location / {      proxy_pass http://myweb/;      proxy_redirect    off;      proxy_set_header  Host             $h

Nginx獲取客戶端IP實現(親測可用)

步驟方法: 1、在代理模組新增紅色部份程式碼 location / {      proxy_pass http://myweb/;      proxy_redirect    off;//這行如果報錯,可以註釋掉      proxy_set_header  Host             $host

httpservletrequest的獲取真實ip

request方法客戶端IP: request.getRemoteAddr() 輸出:192.168.0.106 客戶端主機名:request.getRemoteHost()輸出:abc request.getHeader(“Host”) 輸出:192.16

Django Nginx反代 獲取真實ip

sts conf 獲取 pip style mon else 整數 real p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Andale Mono"; color: #28fe14; background-col

Nginx反向代理時tomcat日誌獲取真實IP

director div tom log sna tomcat XML localhost 如果 對於nginx+tomcat這種架構,如果後端tomcat配置保持默認,那麽tomcat的訪問日誌裏,記錄的就是前端nginx的IP地址,而不是真實的訪問IP。因此,需

nginx反向代理如何獲取真實IP

重啟 public p地址 format sudo con use gin 它的 由於客戶端和web服務器之間增加了中間層,因此web服務器無法直接拿到客戶端的ip,通過$remote_addr變量拿到的將是反向代理服務器的ip地址。 1、安裝--with-http_re

百度雲BLB後NGINX、TOMCAT獲取真實IP

BLB百度雲BLB後NGINX、TOMCAT獲取真實IP一、BLB後Nginx如何獲取真實IP前提:nginx作為slb獲取真實ip是使用 http_realip_module,默認一鍵安裝包安裝的nginx沒有安裝這個模塊需要重新重新編譯nginx並加裝。查看是否安裝此模塊:./nginx -V如沒有安裝此

Nginx反向代理 Laravel獲取真實IP地址(PHP)

代理 pro $1 通過 找到 但是 有一個 忘記 rust 使用VUE前後端分離開發 後端使用Laravel 想要獲取到用戶的真實IP地址 因為分離開發不同源跨域問題 所以只能進行前端Nginx反向代理 location /api { rewrite

nginx前端,tomcat後端伺服器獲取客戶的真實IP,包括tomcat訪問日誌獲取真實IP的配置

原文連結https://blog.csdn.net/teddy17/article/details/51744119 在安裝完以nginx+tomcat的WEB伺服器,使用預設的配置,會導致伺服器上的日誌檔案,只有nginx日誌能獲取到客戶的真實IP,而tomcat以及上面的JAVA WEB應用

Nginx負載均衡後Resin4獲取真實IP地址

  Resin在加了Nginx負載均衡後Resin訪問日誌中得到的ip為Nginx的ip,不是客戶端的真實ip,需要修改resin的配置檔案cluster-default.xml(resin 4): 1. 修改配置Nginx   在Nginx配置新增一個新的Header,用

nginx 反向代理使tomcat日誌中無法獲取真實IP-解決辦法

       使用Nginx作為反向代理時,Tomcat的日誌記錄的客戶端IP就不在是真實的客戶端IP,而是Nginx代理的IP。要解決這個問題可以在Nginx配置一個新的Header,用來儲存$re

Nginx獲取真實IP

server { listen 80; server_name localhost; location /{ root html; index index.html index.htm;

通過nginx反向代理,Tomcat獲取真實的客戶端IP而非伺服器IP

通過nginx反向代理,就獲取不到真實ip,是獲取的nginx的ip,要得到真實的IP要進行配置Nginx的配置檔案: nginx.conf proxy_set_header   X-Real-IP $remote_addr; 例如: ##################

Nginx反向代理Tomcat日誌獲取真實IP

Nginx 配置檔案,加入這行proxy_set_header X-Forwarded-For $remote_addr; Tomcat 的 server.xml, 做如下修改:<Valve className="org.apache.catalina.valves