获取客户端的真实ip地址的php实现方法与原理

 更新时间:2016年11月25日 17:32  点击:2160
在PHP 中使用 $_SERVER["REMOTE_ADDR"] 来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取

(1).REMOTE_ADDR:浏览当前页面的用户计算机的ip地址

(2).HTTP_X_FORWARDED_FOR: 浏览当前页面的用户计算机的网关

(3).HTTP_CLIENT_IP:客户端的ip

在PHP 中使用 $_SERVER["REMOTE_ADDR"] 来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取。

不过要注意的事,并不是每个代理服务器都能用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取客户端的真实 IP,有些用此方法读取到的仍然是代理服务器的 IP。

还有一点需要注意的是:如果客户端没有通过代理服务器来访问,那么用$_SERVER["HTTP_X_FORWARDED_FOR"] 取到的值将是空的。

实例

//经过复杂的判断与算是的获取IP地址函数

 function getIP() {
        if (getenv('HTTP_CLIENT_IP')) {
                        $ip = getenv('HTTP_CLIENT_IP');
                }
                elseif (getenv('HTTP_X_FORWARDED_FOR')) {
                        $ip = getenv('HTTP_X_FORWARDED_FOR');
                }
                elseif (getenv('HTTP_X_FORWARDED')) {
                        $ip = getenv('HTTP_X_FORWARDED');
                }
                elseif (getenv('HTTP_FORWARDED_FOR')) {
                        $ip = getenv('HTTP_FORWARDED_FOR');

 

                }
                elseif (getenv('HTTP_FORWARDED')) {
                        $ip = getenv('HTTP_FORWARDED');
                }
                else {

                        $ip = $_SERVER['REMOTE_ADDR'];
                }
                return $ip;


更多详细内容请查看:php教程er/21/9a34bfce63448271c7b52fa168c3e40f.htm">http://www.111cn.net/phper/21/9a34bfce63448271c7b52fa168c3e40f.htm


//可以分出内网与外网站ip地址获取程序
 

 function getip_out(){
 $ip=false;
 if(!empty($_SERVER["HTTP_CLIENT_IP"])){
  $ip = $_SERVER["HTTP_CLIENT_IP"];
 }
 if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  $ips教程 = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
  if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }
  for ($i = 0; $i < count($ips); $i++) {
   if (!eregi ("^(10│172.16│192.168).", $ips[$i])) {
    $ip = $ips[$i];
    break;
   }
  }
 }
 return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
 }
 
 echo getip_out();

更多详细内容请查看:http://www.111cn.net/phper/21/9a34bfce63448271c7b52fa168c3e40f.htm

下面代码可以判断混合体的字符串中中文字符串的长度的一个函数,因为php不支持中文计算所以我们专业自定义了一个函数。

下面代码可以判断混合体的字符串中中文字符串的长度的一个函数,因为php教程不支持中文计算所以我们专业自定义了一个函数。

header('Content-type:text/html;charset=utf-8');
/**
* 可以统计中文字符串长度的函数
* @param $str 要计算长度的字符串
* @param $type 计算长度类型,0(默认)表示一个中文算一个字符,1表示一个中文算两个字符
*
*/
function abslength($str)
{
if(empty($str)){
return 0;
}
if(function_exists('mb_strlen')){
return mb_strlen($str,'utf-8');
}
else {
preg_match_all("/./u", $str, $ar);
return count($ar[0]);
}
}
$str = '我们都是中国人啊,ye!';
$len = abslength($str);
var_dump($len); //return 12
$len = abslength($str,'1');
echo '<br />'.$len; //return 22
/*
utf-8编码下截取中文字符串,参数可以参照substr函数
@param $str 要进行截取的字符串
@param $start 要进行截取的开始位置,负数为反向截取
@param $end 要进行截取的长度
*/
function utf8_substr($str,$start=0) {
if(empty($str)){
return false;
}
if (function_exists('mb_substr')){
if(func_num_args() >= 3) {
$end = func_get_arg(2);
return mb_substr($str,$start,$end,'utf-8');
}
else {
mb_internal_encoding("UTF-8");
return mb_substr($str,$start);
}
}
else {
$null = "";
preg_match_all("/./u", $str, $ar);
if(func_num_args() >= 3) {
$end = func_get_arg(2);
return join($null, array_slice($ar[0],$start,$end));
}
else {
return join($null, array_slice($ar[0],$start));
}
}
}
$str2 = 'wo要截取zhongwen';
echo '<br />';
echo utf8_substr($str2,0,-4); //return wo要截取zhon

注意在导入时保持数据库的编码与txt文档编码尽量一样,要不可能出现乱码问题哦。

注意在导入时保持数据库教程的编码与txt文档编码尽量一样,要不可能出现乱码问题哦。

<?php教程
  //验证文件类型和错误
if($_FILES["insert_first"]["type"] == "text/plain"){
    echo "第一步:文件类型上传正确"."<br/>";
        if($_FILES["insert_first"]["error"]){
          echo "上传错误:".$_FILES["insert_first"]["error"]."<br/>";
        }else{
          echo "文件名称:".$_FILES["insert_first"]["name"]."<br/>";
          echo "文件类型:".$_FILES["insert_first"]["type"]."<br/>";
          echo "文件大小:".($_FILES["insert_first"]["size"]/1024)."Kb<br/>";
          echo "临时名称:".$_FILES["insert_first"]["tmp_name"]."<br/>";
        }       
  }else{
    echo "上传文件格式不正确";
        exit;
}

//连接数据库
$con = new mysql教程i('localhost','s503440db0','td9928ps教程','s503440db0');
if(mysqli_connect_errno()){
  echo "链接数据库失败";
  exit;
}
 
 
//打开文件
$file = fopen($_FILES["insert_first"]["tmp_name"],"r") or exit("打开文件失败!");

var_dump($file);
echo "<br/>";

while(!feof($file)){ 
  //逐行分拆
  $row = explode(",",fgets($file));
  $row0 = $row[0];
  $row1 = (string)$row[1];
  echo "$row0"."---"."$row1"."<br/>";

  //判断记录是否存在
        $query1 = "select firstid from firstcategory where firstid=$row0";
        $query2 = "select firstname from firstcategory where firstname='$row1'";
        $result1 = $con->query($query1);
        $result2 = $con->query($query2);
    //判断行数
        $result1 = mysqli_num_rows($result1);
        $result2 = mysqli_num_rows($result2);

                 
    if($result1){
          echo "行号{$row0}已存在<br/>";
        }elseif($result2){
          echo "分类{$row1}已存在<br/>";
        }else{
          $query = "insert into firstcategory (firstid,firstname) values ($row0,'音乐')";
          $result = $con->query($query);
        }
}
echo "导入结束,请检查数据是否正确 http://www.111cn.net ";


fclose($file);
$con->close();

?>

mysql数据库

"create table firstcategory (
          firstid int unsigned not null primary key,
                  firstname char(50) not null               
                )";

这里包括了,日期的正则 验证日期 数字 电话号码式 时间格式等一些常用的正则表达式

匹配中文字符的正则表达式: [u4e00-u9fa5]   
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了   
  
匹配双字节字符(包括汉字在内):[^x00-xff]   
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)   
  
匹配空白行的正则表达式:ns*r   
评注:可以用来删除空白行   
  
匹配HTML标记的正则表达式: <(S*?)[^>]*>.*? </1> ¦ <.*? />   
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力   
  
匹配首尾空白字符的正则表达式:^s* ¦s*$   
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式   
  
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*   
评注:表单验证时很实用   
  
匹配网址URL的正则表达式:[a-zA-z]+://[^s]*   
评注:网上流传的版本功能很有限,上面这个基本可以满足需求   
  
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$   
评注:表单验证时很实用   
  
匹配国内电话号码:d{3}-d{8} ¦d{4}-d{7}   
评注:匹配形式如 0511-4405222 或 021-87888822   
  
匹配腾讯QQ号:[1-9][0-9]{4,}   
评注:腾讯QQ号从10000开始   
  
匹配中国邮政编码:[1-9]d{5}(?!d)   
评注:中国邮政编码为6位数字   
  
匹配身份证:d{15} ¦d{18}   
评注:中国的身份证为15位或18位   
  
匹配ip地址:d+.d+.d+.d+   
评注:提取ip地址时有用   
  
匹配特定数字:   
^[1-9]d*$    //匹配正整数   
^-[1-9]d*$   //匹配负整数   
^-?[1-9]d*$   //匹配整数   
^[1-9]d* ¦0$  //匹配非负整数(正整数 + 0)   
^-[1-9]d* ¦0$   //匹配非正整数(负整数 + 0)   
^[1-9]d*.d* ¦0.d*[1-9]d*$   //匹配正浮点数   
^-([1-9]d*.d* ¦0.d*[1-9]d*)$  //匹配负浮点数   
^-?([1-9]d*.d* ¦0.d*[1-9]d* ¦0?.0+ ¦0)$  //匹配浮点数   
^[1-9]d*.d* ¦0.d*[1-9]d* ¦0?.0+ ¦0$   //匹配非负浮点数(正浮点数 + 0)   
^(-([1-9]d*.d* ¦0.d*[1-9]d*)) ¦0?.0+ ¦0$  //匹配非正浮点数(负浮点数 + 0)   
评注:处理大量数据时有用,具体应用时注意修正   
  
匹配特定字符串:   
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串   
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串   
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串   
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串   
^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串   

php教程 unlink与rmdir实现文件与文件夹删除

删除目录及文件
<?php
function delsvn($dir) {
$dh=opendir($dir);
//找出所有".svn" 的文件夹:
while ($file=readdir($dh)) {
if($file!="." && $file!="..") {
$fullpath=$dir."/".$file;
if(is_dir($fullpath)) {
if($file==".svn"){
delsvndir($fullpath);
}else{
delsvn($fullpath);
}
}
}
}
closedir($dh);
}
function delsvndir($svndir){
//先删除目录下的文件:
$dh=opendir($svndir);
while($file=readdir($dh)){
if($file!="."&&$file!=".."){
$fullpath=$svndir."/".$file;
if(is_dir($fullpath)){
delsvndir($fullpath);
}else{
unlink($fullpath);
}
}
}
closedir($dh);
//删除目录文件夹
if(rmdir($svndir)){
return true;
}else{
return false;
}
}
$dir=dirname(__FILE__);
//echo $dir;
delsvn($dir);
?>

删除目录
<?
function deldir($dir) {
//先删除目录下的文件:
$dh=opendir($dir);
while ($file=readdir($dh)) {
if($file!="." && $file!="..") {
$fullpath=$dir."/".$file;
if(!is_dir($fullpath)) {
unlink($fullpath);
} else {
deldir($fullpath);
}
}
}
closedir($dh);
//删除当前文件夹:
if(rmdir($dir)) {
return true;
} else {
return false;
}
}
?>

[!--infotagslink--]

相关文章

  • php语言实现redis的客户端

    php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • EXCEL数据上传到SQL SERVER中的简单实现方法

    EXCEL数据上传到SQL SERVER中的方法需要注意到三点!注意点一:要把EXCEL数据上传到SQL SERVER中必须提前把EXCEL传到服务器上.做法: 在ASP.NET环境中,添加一个FileUpload上传控件后台代码的E.X: 复制代码 代码如下: if...2013-09-23
  • PHP翻页跳转功能实现方法

    我们都知道用php+mysql在web 页实现数据库资料全部显示是非常简单而有趣的,数据库资料很少的情况下页面显示还是让人满意的,但是当数据库资料非常多的情况下,页面的显示情况将会变的非常糟糕,下面就来介绍一下如何实现当...2015-11-08
  • 客户端实现蓝牙接收(C#)知识总结

    网上有关蓝牙接收的资料很多,使用起来也很简单,但是我觉得还是有必要把这些知识总结下来,蓝牙开发需要用到一个第三方的库InTheHand.Net.Personal.dll,感兴趣的朋友可以了解下,或许对你有所帮助...2020-06-25
  • 在页面中输出当前客户端时间javascript实例代码

    这篇文章主要介绍了在页面中输出当前客户端时间javascript实例代码的相关资料,需要的朋友可以参考下...2016-03-03
  • 微信小程序(应用号)开发新闻客户端实例

    这篇文章主要介绍了微信小程序(应用号)开发新闻客户端实例的相关资料,需要的朋友可以参考下...2016-10-25
  • 网页自动调用国内双核浏览器的极速模式的实现方法

    由于国内好几个浏览器都是双核浏览器(蛋痛,做一个浏览器壳就说国产,而且使用率高),有时打开网页会出现不兼容模式,在极速模式下是好的,现在我们来用代码实现网页自动调用国内...2016-09-20
  • PHP JS Ip地址及域名格式检测代码

    PHP IP地址格式检测函数复制代码 代码如下:function checkIp($ip){ $ip = str_replace(" ", "", $ip); $ip = strtolower($ip); $ip= str_replace("http://", "", $ip); $ip= str_replace("https://", ""...2013-10-04
  • C#获取客户端相关信息实例总结

    这篇文章主要介绍了C#获取客户端相关信息的方法,以实例形式总结了C#获取客户端IP地址、网络连接、硬件信息等相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码

    这篇文章主要介绍了js根据手机客户端浏览器类型,判断跳转官网手机网站多个实例代码,需要的朋友可以参考下...2016-05-04
  • PHP中对汉字进行unicode编码和解码的实现方法

    小编推荐的这篇文章介绍了PHP中对汉字进行unicode编码和解码的实现方法,非常实用,有兴趣的同学可以参考一下。 代码如下复制代码 //将内容进行UNICODE编码fu...2017-07-06
  • spring cloud 配置中心客户端启动遇到的问题

    这篇文章主要介绍了spring cloud 配置中心客户端启动遇到的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-25
  • DropDownList添加客户端下拉事件操作

    我们知道,DropDownList下拉框是一个服务器控件,有时候,有些朋友为了方便绑定DropDownList下拉框的选项,但又想在DropDownList实现客户端的下拉事件,那该怎么实现呢?...2021-09-22
  • c# socket编程udp客户端实现代码分享

    这篇文章主要介绍了c# socket编程实现udp客户端,大家参考使用吧...2020-06-25
  • php 获得用户的真实IP地址

    一个段经典的代码可以用来获取用户的真实IP地址,包括可以是内网或是外网,有需要的朋友可以参考一下。 代码如下 复制代码 /** * 获得用户的...2016-11-25
  • 在VMware虚拟机中查看Linux的IP地址的方法

    这篇文章主要介绍了在VMware虚拟机中查看Linux的IP地址的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-16
  • 解决使用了nginx获取IP地址都是127.0.0.1 的问题

    这篇文章主要介绍了解决使用了nginx获取IP地址都是127.0.0.1 的问题,获取i工具的完整代码文中给大家提到,具体实例代码跟随小编一起看看吧...2021-09-18
  • PHP根据IP地址判断城市实现城市切换或跳转代码

    先要获取ip地址相当简单,下面先介绍两种获取IP地址的代码,后面需要利用QQIP库来查找当前IP是属于那个IP段然后得出城市字段并返回。 获取IP地址 代码如下 ...2016-11-25