全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 7481|回复: 20

请教一个Nginx反代取得真实IP的问题

[复制链接]
发表于 2012-7-30 10:34:51 | 显示全部楼层 |阅读模式
本帖最后由 testisitok 于 2012-7-30 10:54 编辑

Nginx反代已经写好,检查参数传递也没有问题:
      server
      {
              listen  80;
              server_name  www.mjj.com;
              location / {
                       proxy_pass  http://www.youjj.com;
                       proxy_redirect off;
                       proxy_set_header   Host             $host;
                       proxy_set_header   X-Real-IP        $remote_addr;
                       proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
              }
              access_log  off;
      }

现在的问题是,我后端的php程序获取IP依靠变量$_SERVER['REMOTE_ADDR'],所以取得的是反代服务器的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 '';
    }
}

但是后端的php程序是加密的,无法改动!

现在请问:有没有办法不改动程序把X-REAL-IP或HTTP_X_FORWARDED_FOR赋值到REMOTE_ADDR?譬如改动php.ini能不能实现?
发表于 2012-7-30 10:43:37 | 显示全部楼层
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
加一条试试:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
发表于 2012-7-30 10:44:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2012-7-30 10:48:04 | 显示全部楼层
后端用这个 http://wiki.nginx.org/HttpRealipModule
 楼主| 发表于 2012-7-30 10:55:09 | 显示全部楼层
lazyzhu 发表于 2012-7-30 10:43
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ...

你这个一看就知道错的
发表于 2012-7-30 10:57:04 | 显示全部楼层
Kokgog 发表于 2012-7-30 10:48
后端用这个 http://wiki.nginx.org/HttpRealipModule

你说的应该是mod_extforward吧,
http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ModExtForward
 楼主| 发表于 2012-7-30 11:00:42 | 显示全部楼层
本帖最后由 testisitok 于 2012-7-30 11:03 编辑
Kokgog 发表于 2012-7-30 10:48
后端用这个 http://wiki.nginx.org/HttpRealipModule


你这个是前段nginx的编译模块

我的前段是没有问题的,X-Real-IP和X-Forwarded-For都能把客户的真实IP传到后端

现在的问题是后端程序获取的是$_SERVER['REMOTE_ADDR'],和X-Real-IP和X-Forwarded-For压根无关。

我想的是能否在后端不改动php程序把 X-Real-IP或X-Forwarded-For 传给REMOTE_ADDR。

请各位看清我的问题,谢谢!
发表于 2012-7-30 11:06:14 | 显示全部楼层
lazyzhu 发表于 2012-7-30 10:57
你说的应该是mod_extforward吧,
http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ModExtForwar ...

这个我没用过, apache和lighttpd都有个mod_rpaf扩展用来处理这个问题的
发表于 2012-7-30 11:08:33 | 显示全部楼层
testisitok 发表于 2012-7-30 11:00
你这个是前段nginx的编译模块

我的前段是没有问题的,X-Real-IP和X-Forwarded-For都能把客户的真实IP传 ...


This module allows to change the client's IP address to value from request header (e. g. X-Real-IP or X-Forwarded-For).

It is useful if nginx works behind some proxy of L7 load balancer, and the request comes from a local IP, but proxy add request header with client's IP.

This module isn't built by default, enable it with the configure option

我是没看错你问题, 但是你看清这答案了么。。。。。
发表于 2012-7-30 11:12:53 | 显示全部楼层
记得我上次研究过....忘记成功没,也忘记做笔记了...哎~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-4-23 23:22 , Processed in 0.158145 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表