Nginx-nginx如何获取访问者IP

发布于 2016-10-13 10:50:22 字数 222 浏览 1331 评论 4

nginx如何判断一个访问者的IP在某一个IP段?
有这样的需求:
如果访问者的IP是 192.168.0.0/24 就访问 http://www.domain.com
如果访问者的IP是 192.168.1.0/24 就访问 http://new.domain.com
这个要怎么实现?

比如网站新上线,只要某一个IP段访问这个新上线的站,其它IP段的用户还是访问老的站。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

虐人心 2017-07-21 00:20:59

可以这样,IP地址还支持正则表达式:

if ($remote_addr == "192.168.0.0"){
rewrite (*) http://www.domain.com
}
if ($remote_addr == "192.168.1.0"){
rewrite (*) http://new.domain.com
}

参考:Securing Arbitrary URIs in Nginx

泛泛之交 2017-07-01 22:39:58

在nginx的配置中加上,判断和分发代理

IP段的话,你可以写一个lua接口,将网上的ip段找到对应的区域(比如:us,cn),然后根据这些区分发代理到不同的接口

偏爱自由 2017-06-26 17:55:36

有两种方式实现上面功能:

一、配置nginx服务器,实现域名跳转。
二、在网站系统里进行跳转,比如 php 通过 $_SERVER["REMOTE_ADDR"] 获取访问者的 ip,然后根据 ip 在网站入库处进行跳转。

偏爱自由 2017-04-10 07:10:12

Nginx默认是可以获取访问者的信息,如果使用PHP程序的话,建议使用下面的这种完整的形式,下面的内容程序是我以前的一篇笔记:

<?php
/**
* 获取用户IP地址
* @Return: string
*/
function getIP()
{
static $realip;
if (isset($_SERVER))
{
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"]))
{
$realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else if (isset($_SERVER["HTTP_CLIENT_IP"]))
{
$realip = $_SERVER["HTTP_CLIENT_IP"];
} else {
$realip = $_SERVER["REMOTE_ADDR"];
}} else {
if (getenv("HTTP_X_FORWARDED_FOR"))
{
$realip = getenv("HTTP_X_FORWARDED_FOR");
} else if (getenv("HTTP_CLIENT_IP"))
{
$realip = getenv("HTTP_CLIENT_IP");
} else {
$realip = getenv("REMOTE_ADDR");
}
}
return $realip;
}
?>

getenv("REMOTE_ADDR")用来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 getenv("HTTP_X_FORWARDED_FOR") 来读取。
但是如果客户端没有通过代理服务器来访问,那么用getenv("HTTP_X_FORWARDED_FOR") 取到的值将是空的。

else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
表示如果getenv("HTTP_X_FORWARDED_FOR") 取到的值存在不为空(即客户端使用代理服务器的情况下),则变量$ip等于getenv("HTTP_X_FORWARDED_FOR") 取到的真实IP值。

如果上面的else if(getenv("HTTP_X_FORWARDED_FOR"))取得的值为空(即没有使用代理服务器),则不会执行下面的$ip = getenv("HTTP_X_FORWARDED_FOR");这一行语句。
这种情况下已经确认客户端没有使用代理服务器,从而通过
else if(getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");
这两行语句获得客户端的IP地址也是真实的IP地址。

这样的话进行了多次判断,可以在服务器某个超级SERVER变量没有设置的情况下使用另外的超级变量,更容易准确的获取客户端的IP地址。

Good Luck~

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文