我有个域名地址,通过智能DNS会根据不同运营商把客户端数据post到不同服务器。
服务器上通过一个PHP接收数据并获取客户端地址,代码如下:
if($_SERVER['HTTP_X_FORWARDED_FOR'] && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/',$_SERVER['HTTP_X_FORWARDED_FOR'])) {
$xff = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
elseif($_SERVER['HTTP_CLIENT_IP'] && preg_match('/^([0-9]{1,3}.){3}[0-9]{1,3}$/',$_SERVER['HTTP_CLIENT_IP'])) {
$xff = $_SERVER['HTTP_CLIENT_IP'];
}
else {
$xff = $_SERVER['REMOTE_ADDR'];
}
现在分析获取的数据,发现获取的客户端配置的IP DNS很多是联通或者电信的,但是域名却被解析到教育网的IP上,xff获取的IP也是教育网的
其他服务器没出现这问题,比如联通的IP DNS解析域名到联通服务器,xff也是联通,唯独教育网有这个问题,请问这个要怎么解释呢?
1
Septembers 2015-05-27 15:28:58 +08:00 1
|
2
lsylsy2 2015-05-27 16:01:47 +08:00
很多教育网不是纯的教育网,而是类似长宽、移动这样,拉了其他宽带的线做出口。可能是这种情况。
|
3
fangjinmin 2015-05-27 16:06:12 +08:00
你要做的是不是取得用户的IP,然后根据IP,选择服务器?
HTTP_X_FORWARDED_FOR是经过了代理服务器的转发后才会有的。 说明教育网经过了代理服务器的中转。 |
4
fxxkgw OP @fangjinmin 感谢回复。
大体流程是先获取用户IP DNS 这些不需要远程服务器的脚本,直接在客户端上处理。然后post到一个URL,只能DNS会根据用户信息解析出URL对应的IP,类似于客户端运行nslookup 或dig命令。然后发送数据到远程服务器,服务器再接收数据。 如果用户配置的DNS是电信或联通的,那为啥解析出的URL地址对应的是教育网的呢? |
5
fangjinmin 2015-05-27 16:18:53 +08:00
@fxxkgw 我不知道你说的智能DNS是怎么做的,我觉得你要去研究一下,你说的所谓智能DNS了。你希望做的结果同一个网络的IP,POST数据到布署在这个网络的专用服务器上吧?但是有可能你说的智能DNS是否会根据网速判断呢?比如如果连接到电信的服务器更快,它是否是选择了电信的服务器?
|
6
fxxkgw OP @fangjinmin 这个是CDN相关的,智能DNS作用就是,比如你是联通用户,访问www.abc.com时,就给你把abc.com解析到联通的服务器上,同理你是电信用户,就解析到电信服务器上。这样可以优化网站访问速度。
|
7
fangjinmin 2015-05-27 16:36:26 +08:00
其实这个就很好解释了,教育网的IP,但是出口是在电信或者联通。你客户端取到的是教育网的IP,你的程序也是取到的教育网的IP,因为程序取的是HTTP_X_FORWARDED_FOR。而CDN取到的地址用PHP里面的参数来打比方的话,就是REMOTE_ADDR。
|
8
jsq2627 2015-05-27 18:07:10 +08:00
你这个“智能DNS”的描述不清楚啊
这到底是反向代理还是 DNS? HTTP_X_FORWARDED_FOR 是反向代理才有的。 |