Nginx-nginx如何获取访问者IP
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
可以这样,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
在nginx的配置中加上,判断和分发代理
IP段的话,你可以写一个lua接口,将网上的ip段找到对应的区域(比如:us,cn),然后根据这些区分发代理到不同的接口
有两种方式实现上面功能:
一、配置nginx服务器,实现域名跳转。
二、在网站系统里进行跳转,比如 php 通过 $_SERVER["REMOTE_ADDR"] 获取访问者的 ip,然后根据 ip 在网站入库处进行跳转。
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~