PHP判断ajax请求类型(HTTP_X_REQUESTED_WITH)

 更新时间:2016年11月25日 15:45  点击:1656
在jquery中的ajax请求方法有很多,可是$.ajax, $.get, or $.post,并且他可以是json,html,txt等格式,这样我们需要在php根据ajax发送过来的HTTP_X_REQUESTED_WITH是否为ajax请求,然后再根据$_SERVER[\'HTTP_ACCEPT\']检判断是那格式的请求。


php中就是在header一层判断是否是ajax请求,对应的根据$_SERVER['HTTP_X_REQUESTED_WITH']判断。

 代码如下 复制代码

/**
  * 当前请求是否ajax请求
  *
  * @access public
  * @return bool
  */
 function isAjax()
 {
     return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'XMLHttpRequest';
 }

一般情况下$_SERVER['HTTP_X_REQUESTED_WITH']默认是XMLHttpRequest


ajax跨域只能指定jsonp格式的数据,这个是就不是XMLHttpRequest对象了,就算你自定义一个$_SERVER['HTTP_X_REQUESTED_WITH']也是没有意义的

解决的办法:
针对跨域情况的getjson 或者ajax(jsonp)可以使用ACCEPT请求头部格式来判断

PHP端对应$_SERVER['HTTP_ACCEPT']

jsonp的请求一般是:text/javascript, application/javascript, */*

json的请求:application/json, text/javascript, */*

一个简单的判断跨域条件下的ajax请求:

 代码如下 复制代码

switch ($_SERVER['HTTP_ACCEPT']){ 
    case 'application/json, text/javascript, */*': 
        //  JSON 格式 
        break; 
    case 'text/javascript, application/javascript, */*': 
        // javascript 或 JSONP 格式 
        break; 
    case 'text/html, */*': 
        //  HTML 格式 
        break; 
    case 'application/xml, text/xml, */*': 
        //  XML 格式 
        break; 
}

在php中我们经常会需要把字符串中的超级链接地址与url给过滤掉,下面我来利用php正则功能实现替换掉网页中所有超链接与url实例,各位朋友可参考。

正则替换掉网页中所有超链接

 代码如下 复制代码

<?php
$content = file_get_contents('test.html');
$url = 'http://www.111cn.net';  //要换成的新网址
$preg = '/[s]href=("|')[S]*("|')/i';
$replace = ' href="' . $url . '"';
$content = preg_replace($preg, $replace, $content);  //正则替换
create_log('newhtml', $content);  //生成新文件
?>

下面是写文件操作

 代码如下 复制代码

function create_log($filename, $text) {
       if ( strtolower(substr($filename, -4)) != 'html' ){
              $filename .= '.html';
       }
       $filename = dirname ( __FILE__ ) . '/' . $filename;
       if (!file_exists ( $filename )) {
              exec( 'touch '. $filename);
              exec( 'chmod 777 '. $filename);
       }
       $handle = fopen ( $filename, "w+b" );
       $text .= "rn";
       fwrite($handle, $text);
       fclose ( $handle );
}

下面我一个采集的功能

 代码如下 复制代码

$url ='http://www.111cn.net';
$body=@file_get_contents($url);
preg_match_all('/href=['"]?([^'"]*)['"]?>(.*)/i',$body,$b);
$nums = array();
foreach($b[1] as $u){
  if(in_array($u,$nums)){
  continue;
  }
  $nums[]=$u;
  $title=strip_tags($u);
  echo $title."</br>";
}

在php中页面跳转我们用到的是header函数了,如果要定时跳转页面我们就必须使用js或html了,下面我来给各位同学总结一下各种页面跳转的实现程序。

header()函数

header()函数是PHP中进行页面跳转的一种十分简单的方法。header()函数的主要功能是将HTTP协议标头(header)输出到浏览器。

header()函数的定义如下:

void header (string string [,bool replace [,int http_response_code]])

可选参数replace指明是替换前一条类似标头还是添加一条相同类型的标头,默认为替换。

第二个可选参数http_response_code强制将HTTP相应代码设为指定值。 header函数中Location类型的标头是一种特殊的header调用,常用来实现页面跳转。注意:1.location和“:”号间不能有空格,否则不会跳转。


1.使用php里head函数进行跳转


注意:head跳转前不要有任何输出,不然可能不能跳转.

 代码如下 复制代码

header("refresh:3;url=http://www.111cn.net");//限时跳转
header('location:http://www.111cn.net');//立即跳转


2. HTML meta refresh 刷新与跳转(重定向)页面

Meta标签

Meta标签是HTML中负责提供文档元信息的标签,在PHP程序中使用该标签,也可以实现页面跳转。 若定义http-equiv为refresh,则打开该页面时将根据content规定的值在一定时间内跳转到相应页面。


refresh 属性值 — 刷新与跳转(重定向)页面

refresh用于刷新与跳转(重定向)页面

refresh出现在http-equiv属性中,使用content属性表示刷新或跳转的开始时间与跳转的网址

 代码如下 复制代码

<meta http-equiv="refresh" content="3; url=http://www.111cn.net">


3.js实现页面跳转

js实现跳转主要用到location对象

 代码如下 复制代码

<script type='text/javascript'>
 // 立即跳转
 window.location.href = 'http://www.111cn.net';
 // 限时跳转
 setTimeout(function(){
  // 3秒后跳转
  window.location.href = 'http://www.111cn.net';
 },3000);
</script>

在php中如果我们要获取汉字的拼音第一个字母我们先要了解asc码的范围码了,我们只要知道这个值上下限就可以使用php中的ord来获取我相关的汉字拼音了。

实例1

 代码如下 复制代码

function getFirstCharter($str) {
    if (empty($str)) {return '';}
    $fchar = ord($str{0});
    if ($fchar>=ord('A') && $fchar<=ord('z')) return strtoupper($str{0});
    $s1 = iconv('UTF-8', 'gb2312', $str);
    $s2 = iconv('gb2312', 'UTF-8', $s1);
    $s = $s2 == $str ? $s1 : $str;
    $asc = ord($s{0})*256 + ord($s{1}) - 65536;
    if ($asc>=-20319 && $asc<=-20284) return 'A';
    if ($asc>=-20283 && $asc<=-19776) return 'B';
    if ($asc>=-19775 && $asc<=-19219) return 'C';
    if ($asc>=-19218 && $asc<=-18711) return 'D';
    if ($asc>=-18710 && $asc<=-18527) return 'E';
    if ($asc>=-18526 && $asc<=-18240) return 'F';
    if ($asc>=-18239 && $asc<=-17923) return 'G';
    if ($asc>=-17922 && $asc<=-17418) return 'H';
    if ($asc>=-17417 && $asc<=-16475) return 'J';
    if ($asc>=-16474 && $asc<=-16213) return 'K';
    if ($asc>=-16212 && $asc<=-15641) return 'L';
    if ($asc>=-15640 && $asc<=-15166) return 'M';
    if ($asc>=-15165 && $asc<=-14923) return 'N';
    if ($asc>=-14922 && $asc<=-14915) return 'O';
    if ($asc>=-14914 && $asc<=-14631) return 'P';
    if ($asc>=-14630 && $asc<=-14150) return 'Q';
    if ($asc>=-14149 && $asc<=-14091) return 'R';
    if ($asc>=-14090 && $asc<=-13319) return 'S';
    if ($asc>=-13318 && $asc<=-12839) return 'T';
    if ($asc>=-12838 && $asc<=-12557) return 'W';
    if ($asc>=-12556 && $asc<=-11848) return 'X';
    if ($asc>=-11847 && $asc<=-11056) return 'Y';
    if ($asc>=-11055 && $asc<=-10247) return 'Z';
    return null;

例如:
 

echo getFirstCharter("程序员3aj.cn"); // 结果将输出:C


实例二

 代码如下 复制代码
<?php
 
$limit=array( //gb2312 拼音排序
    array(45217,45252), //A
    array(45253,45760), //B
    array(45761,46317), //C
    array(46318,46825), //D
    array(46826,47009), //E
    array(47010,47296), //F
    array(47297,47613), //G
    array(47614,48118), //H
    array(0,0),         //I
    array(48119,49061), //J
    array(49062,49323), //K
    array(49324,49895), //L
    array(49896,50370), //M
    array(50371,50613), //N
    array(50614,50621), //O
    array(50622,50905), //P
    array(50906,51386), //Q
    array(51387,51445), //R
    array(51446,52217), //S
    array(52218,52697), //T
    array(0,0),         //U
    array(0,0),         //V
    array(52698,52979), //W
    array(52980,53688), //X
    array(53689,54480), //Y
    array(54481,55289), //Z
);
 
$str="A:这是一个测试程序1";
$str= iconv("UTF-8","gb2312", $str);
echo $str."</br>";
$i=0;
while($i<strlen($str) ) {
    $tmp=bin2hex(substr($str,$i,1));
    if($tmp>='B0'){ //汉字的开始
        $t=getLetter(hexdec(bin2hex(substr($str,$i,2))));
        printf("%c",$t==-1 ? '*' : $t );
        $i+=2;
    }
    else{
        printf("%s",substr($str,$i,1));
        $i++;
    }
}
 
function getLetter($num){
    global $limit;
    $char_index=65;
    foreach($limit as $k=>$v){
        if($num>=$v[0] && $num<=$v[1]){
            $char_index+=$k;
            return $char_index;
        }
    }
    return -1;
}
?>
今天我来给大家介绍在php中关于文件上传整个流程,从表单创建到后面的文件上传大小限制等等,欢迎各位朋友进入学习,希望对各位朋友有所帮助。

创建一个文件上传表单
允许用户从表单上传文件是非常有用的。

请看下面这个供上传文件的 HTML 表单:

 代码如下 复制代码

<html>
<body>

<form action="upload_file.php" method="post" enctype="multipart/form-data">
 <label for="attach_file">Filename:</label>
 <input type="file" name="attach_file" id="attach_file" />
 <br />
 <input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>

请留意如下有关此表单的信息:

<form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。

<input> 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。

注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。

创建上传脚本
"upload_file.php" 文件含有供上传文件的代码:

 代码如下 复制代码


<?php
if ($_FILES["attach_file"]["error"] > 0) {
 echo "Error: " . $_FILES["attach_file"]["error"] . "<br />";
} else {
 echo "Upload: " . $_FILES["attach_file"]["name"] . "<br />";
 echo "Type: " . $_FILES["attach_file"]["type"] . "<br />";
 echo "Size: " . ($_FILES["attach_file"]["size"] / 1024) . " Kb<br />";
 echo "Stored in: " . $_FILES["attach_file"]["tmp_name"];
}
?>

通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。

第一个参数是表单的 input name(表单file组件的name值),第二个下标可以是 "name", "type", "size", "tmp_name" 或 "error"。就像这样:

$_FILES["attach_file"]["name"] - 被上传文件的名称
$_FILES["attach_file"]["type"] - 被上传文件的类型
$_FILES["attach_file"]["size"] - 被上传文件的大小,以字节(b)为单位
$_FILES["attach_file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
$_FILES["attach_file"]["error"] - 由文件上传导致的错误代码
这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关什么用户有权上传文件的限制。

上传限制
在这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif 或 .jpeg 文件,文件大小必须小于 20 kb:

 

 代码如下 复制代码

<?php

if ((($_FILES["attach_file"]["type"] == "image/gif") || ($_FILES["attach_file"]["type"] == "image/jpeg") || ($_FILES["attach_file"]["type"] == "image/pjpeg")) && ($_FILES["attach_file"]["size"] < 20000)) {
 if ($_FILES["attach_file"]["error"] > 0) {
  echo "Error: " . $_FILES["attach_file"]["error"] . "<br />";
 } else {
  echo "Upload: " . $_FILES["attach_file"]["name"] . "<br />";
  echo "Type: " . $_FILES["attach_file"]["type"] . "<br />";
  echo "Size: " . ($_FILES["attach_file"]["size"] / 1024) . " Kb<br />";
  echo "Stored in: " . $_FILES["attach_file"]["tmp_name"];
 }
} else {
 echo "Invalid file";
}

?>

注释:对于 IE,识别 jpg 文件的类型必须是 pjpeg,对于 FireFox,必须是 jpeg。

保存被上传的文件
上面的例子在服务器的 PHP 临时文件夹创建了一个被上传文件的临时副本。

这个临时的复制文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:

 

 代码如下 复制代码
<?php
if ((($_FILES["attach_file"]["type"] == "image/gif") || ($_FILES["attach_file"]["type"] == "image/jpeg") || ($_FILES["attach_file"]["type"] == "image/pjpeg")) && ($_FILES["attach_file"]["size"] < 20000)) {
 if ($_FILES["attach_file"]["error"] > 0) {
  echo "Return Code: " . $_FILES["attach_file"]["error"] . "<br />";
 } else {
  echo "Upload: " . $_FILES["attach_file"]["name"] . "<br />";
  echo "Type: " . $_FILES["attach_file"]["type"] . "<br />";
  echo "Size: " . ($_FILES["attach_file"]["size"] / 1024) . " Kb<br />";
  echo "Temp file: " . $_FILES["attach_file"]["tmp_name"] . "<br />";
  
  if (file_exists("upload/" . $_FILES["attach_file"]["name"])) {
   echo $_FILES["attach_file"]["name"] . " already exists. ";
  } else {
   move_uploaded_file($_FILES["attach_file"]["tmp_name"], "upload/" . $_FILES["attach_file"]["name"]);
   echo "Stored in: " . "upload/" . $_FILES["attach_file"]["name"];
  }
 }
} else {
 echo "Invalid file";
}
?>

上面的脚本检测了是否已存在此文件,如果不存在,则把文件拷贝到指定的文件夹。

注意:这个例子把文件保存到了名为 "upload" 的新文件夹。

上传文件大小限制大全   


在php.ini里面可以设置最大上传文件大小

解决方法:

第一:

在php.ini里面查看如下行:

 upload_max_filesize = 8M 

 post_max_size = 10M 

 memory_limit = 20M

另外要确认上传的 <form> 里类似下面的这行

<input type="hidden" name="MAX_FILE_SIZE" value="500000">

第二:

如果是apache 2 需要修改

view sourceprint?1 /etc/httpd/conf.d/php.conf

中的LimitRequestBody 524288将524288(=512×1024)改大,比如5M(=5×1024×1024)

 另外:PHP的最大执行时间也是可能影响的因素。

也可通过php文件临时设置,代码如下:

 代码如下 复制代码

<?php
 ini_set('max_execution_time', '600');
 ini_set('post_max_size ', '100M');  // 好像设置不成功,不起作用
 ini_set('upload_max_filesize', '200M'); // 好像设置不成功,不起作用
?>

打开php.ini,首先找到

;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;

区域,有影响文件上传的以下几个参数:

file_uploads  =  on  ;是否允许通过HTTP上传文件的开关。默认为ON即是开
upload_tmp_dir  ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
upload_max_filesize  =  200m  ;望文生意,即允许上传文件大小的最大值。默认为2M

;;;;;;;;;;;;;;;;;
; Data Handling ;
;;;;;;;;;;;;;;;;;

区域,还有一项:

post_max_size  =  100m ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M
一般地,设置好上述四个参数后,上传<=8M的文件是不成问题,在网络正常的情况下。

但如果要上传>8M的大体积文件,只设置上述四项还一定能行的通。除非你的网络真有100M/S的上传高速,否则你还得关心关心下面的参数:

;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time  =  600 ;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit  =  8m  ;每个PHP页面所吃掉的最大内存,默认8M
把上述参数修改后,在网络所允许的正常情况下,就可以上传大体积文件了。

好了,设置好现在就可以一试。点击一200大M的文件上传一下

在你听歌、想MM或上厕所回来过程中,程序会告诉你上传成功啦~

在本机上测试上传200M的文件成功。

 

工作中的一次配置:

 代码如下 复制代码

upload_max_filesize  300M
post_max_size   350M
memory_limit   400M
max_execution_time  600
max_input_time   600

补充说明:需要保持 memory_limit > post_max_size > upload_max_filesize

[!--infotagslink--]

相关文章