解决方案 »
- 比如函数外边有一个二维数组把参数传递到函数中 通过函数处理得到下面的值 请把函数写下
- PHP数组问题
- session怎么样在两个域名间传递
- 'Smarty' 搞得没办法了
- 不理解$_POST[]的作用时间
- mysqli 出了点问题,大家来看看
- 数组如何排序
- PREG如何设置不匹配某个字符串?
- 为什么用select * from articles where turn=1 order by sj desc无法获得数据?
- 给PHP疯子看的。(根据单表操作的SQL语句,自动生成PHP文件胚子)[原创]
- 求把这几段JS代码转成PHP代码,太菜编辑N久都运行不出正确内容
- mysql 分组按name分组取值最大一条,不理解啊,求解惑。
<?
function GetIP() {
if ($_SERVER["HTTP_X_FORWARDED_FOR"])
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
else if ($_SERVER["HTTP_CLIENT_IP"])
$ip = $_SERVER["HTTP_CLIENT_IP"];
else if ($_SERVER["REMOTE_ADDR"])
$ip = $_SERVER["REMOTE_ADDR"];
else if (getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("HTTP_CLIENT_IP"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");
else
$ip = "Unknown";
return $ip;
}
$userip=GetIP();
/*
函数名称:ipCity
参数说明:$userip——用户IP地址
函数功能:PHP通过IP地址判断用户所在城市
author:lee
contact:[email protected]
*/
function ipCity($userip) {
//IP数据库路径,这里用的是QQ IP数据库 20110405 纯真版
$dat_path = 'qqwry.dat';
//判断IP地址是否有效
if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$", $userip)){
return 'IP Address Invalid';
}
//打开IP数据库
if(!$fd = @fopen($dat_path, 'rb')){
return 'IP data file not exists or access denied';
}
//explode函数分解IP地址,运算得出整数形结果
$userip = explode('.', $userip);
$useripNum = $userip[0] * 16777216 + $userip[1] * 65536 + $userip[2] * 256 + $userip[3];
//获取IP地址索引开始和结束位置
$DataBegin = fread($fd, 4);
$DataEnd = fread($fd, 4);
$useripbegin = implode('', unpack('L', $DataBegin));
if($useripbegin < 0) $useripbegin += pow(2, 32);
$useripend = implode('', unpack('L', $DataEnd));
if($useripend < 0) $useripend += pow(2, 32);
$useripAllNum = ($useripend - $useripbegin) / 7 + 1;
$BeginNum = 0;
$EndNum = $useripAllNum;
//使用二分查找法从索引记录中搜索匹配的IP地址记录
while($userip1num>$useripNum || $userip2num<$useripNum) {
$Middle= intval(($EndNum + $BeginNum) / 2);
//偏移指针到索引位置读取4个字节
fseek($fd, $useripbegin + 7 * $Middle);
$useripData1 = fread($fd, 4);
if(strlen($useripData1) < 4) {
fclose($fd);
return 'File Error';
}
//提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
$userip1num = implode('', unpack('L', $useripData1));
if($userip1num < 0) $userip1num += pow(2, 32);
//提取的长整型数大于我们IP地址则修改结束位置进行下一次循环
if($userip1num > $useripNum) {
$EndNum = $Middle;
continue;
}
//取完上一个索引后取下一个索引
$DataSeek = fread($fd, 3);
if(strlen($DataSeek) < 3) {
fclose($fd);
return 'File Error';
}
$DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
fseek($fd, $DataSeek);
$useripData2 = fread($fd, 4);
if(strlen($useripData2) < 4) {
fclose($fd);
return 'File Error';
}
$userip2num = implode('', unpack('L', $useripData2));
if($userip2num < 0) $userip2num += pow(2, 32);
//找不到IP地址对应城市
if($userip2num < $useripNum) {
if($Middle == $BeginNum) {
fclose($fd);
return 'No Data';
}
$BeginNum = $Middle;
}
}
$useripFlag = fread($fd, 1);
if($useripFlag == chr(1)) {
$useripSeek = fread($fd, 3);
if(strlen($useripSeek) < 3) {
fclose($fd);
return 'System Error';
}
$useripSeek = implode('', unpack('L', $useripSeek.chr(0)));
fseek($fd, $useripSeek);
$useripFlag = fread($fd, 1);
}
if($useripFlag == chr(2)) {
$AddrSeek = fread($fd, 3);
if(strlen($AddrSeek) < 3) {
fclose($fd);
return 'System Error';
}
$useripFlag = fread($fd, 1);
if($useripFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return 'System Error';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) != chr(0))
$useripAddr2 .= $char;
$AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
fseek($fd, $AddrSeek);
while(($char = fread($fd, 1)) != chr(0))
$useripAddr1 .= $char;
} else {
fseek($fd, -1, SEEK_CUR);
while(($char = fread($fd, 1)) != chr(0))
$useripAddr1 .= $char;
$useripFlag = fread($fd, 1);
if($useripFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return 'System Error';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) != chr(0)){
$useripAddr2 .= $char;
}
}
fclose($fd);
//返回IP地址对应的城市结果
if(preg_match('/http/i', $useripAddr2)) {
$useripAddr2 = '';
}
$useripaddr = "$useripAddr1 $useripAddr2";
$useripaddr = preg_replace('/CZ88.Net/is', '', $useripaddr);
$useripaddr = preg_replace('/^s*/is', '', $useripaddr);
$useripaddr = preg_replace('/s*$/is', '', $useripaddr);
if(preg_match('/http/i', $useripaddr) || $useripaddr == '') {
$useripaddr = 'No Data';
}
return $useripaddr;
}
?><script language="javascript">
var city='<?php echo ipCity($userip);?>';
if(city.indexOf("西宁市")>=0){
window.location.href="http://www.js0971.com/";
}else{
window.location.href="http://bj.0971my.com/";
}
</script>
这个是ipaddress.php页面require (ROOT_PATH . 'include/config.php');
require (ROOT_PATH . 'include/smarty/Smarty.class.php');
require (ROOT_PATH . 'include/mysql.class.php');
require (ROOT_PATH . 'include/action.class.php');
require (ROOT_PATH . 'include/check.class.php');
require (ROOT_PATH . 'include/page.class.php');
require (ROOT_PATH . 'include/ipaddress.php'); 这个是判断ip切换城市的
这是公共调用文件的一部分网站只有一个index.php页面
var city='<?php echo ipCity($userip);?>';
if(city.indexOf("西宁市")>=0){
window.location.href="http://www.js0971.com/";
}else{
window.location.href="http://bj.0971my.com/";
}
</script>中,无论 city 是什么内容,总是要跳转的
那么你究竟想转到哪里去?
那么在 西宁市 就不需要跳转了
if(city.indexOf("西宁市")>=0){
//window.location.href="http://www.js0971.com/";
}else{
window.location.href="http://bj.0971my.com/"; //不是西宁市才需要跳转
}
难道你在 bj.0971my.com 也判断是否 西宁市 吗?
<script language="javascript">
var city='<?php echo ipCity($userip);?>';
if(city.indexOf("西宁市")>=0){
window.location.href="http://www.js0971.com/";
}else{
window.location.href="http://bj.0971my.com/";
}
</script>
这句我只是放了个例子,具体程序我还没写到里面去,只是测试一下就出来问题了,主要就是网址打开最先访问的都是这个index.php页面而且是唯一一个页面,区别就是不同城市显示不同东西。现在我要解决的就是怎么实现这个,要怎么做才不会出现我上述的问题。
你既然是根据用户的 ip 跳转对应的二级域名,那么你就应该有一个城市(地区)与二级域名的对照表
当从 ip 取得城市(地区)名时,从此表查得二级域名进行跳转就可以了(header 函数),当然还要和 $_SERVER['HTTP_HOST'] 比较一下,已经是了就不再跳转了
<?php
//开始获取城市IP
$userip=GetIP();
//获取城市
$city=ipCity($userip);
/*从数据库获取二级域,如果存在则跳转至二级域名,否则直接默认一级域名http://www.0971my.com*/
$sql=$db->query("select * from ".$db->table('area')." where title like '%".$city."%'");
$row=$db->fetch_array($sql);
if(!$row){
header("Location:http//www.0971my.com");
}else{
if($row['title']=='西宁市'){
header("Location:http://www.0971my.com");
}else{
header("Location:".$row['dns']."");
}
}
?>
你这样写死了怎么行。
分站域名, bj.xxx.com, xa.xxx.com, gz.xxx.com ....从www来的请求,根据ip跳转到分站, 分站的代码不需要跳转,简单判断域名然后用header()跳转就好了。