php header请求重写向的一个问题

 更新时间:2016年11月25日 17:37  点击:2112
同事叫我帮忙解释一个问题:一个PHP生成的重定向请求,在Nginx日志里产生两种截然不同的记录:一种响应体大小是零个字节;另一种响应体大小是五个字节

现在年纪大了,面对问题时的嗅觉不再灵敏,第一感觉零是正确的,心想是不是重定向后忘记退出了,后面还有内容输出,可是查了一下代码发现没有问题:

 
<?php
header('Location: /path');
exit;
?>

在绕了一大圈之后,我猛然意识到环境是Nginx+PHP,响应没有「Content-Length」,数据是通过「Transfer-Encoding」分块发送的,所以重定向的空响应体实际类似:

    0\r\n\r\n

不多不少,正好五个字节,细节大家可以参考Chunked transfer encoding。如此看来在此类空响应体的情况下,PHP主动输出一个「Content-Length: 0」说不定会更好些。

那零个字节的响应如何解释呢?查询日志发现如下两种情况:

    HEAD “/path HTTP/1.1″ 302 0
    GET “/path HTTP/1.0″ 302 0

前者是HEAD请求,不需要响应体;后者是HTTP/1.0,不支持「Transfer-Encoding」。

问题基本解释清楚了,擦擦额头的汗,总算没在同事面前丢脸。

json_decode对于英文估计返回都是正常的但有些朋友碰到中文时会就发现返回为null或空了,下面我来给各位朋友简单介绍此问题解决方法。

今天在做一个东西的时候需要抓取淘宝的一些数据,找到了请求的url,返回了一个callback,看了下callback中的参数是一个对象,通过正则匹配去到了数组,但是在使用json_decode()转换的时候返回的是NULL,老郁闷了,前一段时间要做一个东西也是因为这个原因,没有成功的把json对象转换成php的数组,放弃了,今天又遇到了,终于找到了解决的办法。

原因在于:抓取的数数据是是GBK格式,通过抓包看到,返回的header头中

 代码如下 复制代码

 Content-Type:text/html;charset=GBK

这个时候用icvo转码下,然后在json_decode()就可以正常转换了

 代码如下 复制代码

iconv('gbk','utf-8',$data[1][0]);


这里还需要主要的是你php代码文件的格式,建议是utf-8无bom头。


昨天发现博客的收录全部掉了,网站关了一个多月,唉。度娘你就块收了我把。

利用php读取数据库时如果页面与数据库编码不一致中文就会有乱码了,但我们可以通过set names来强制统一编码。

首先需要修改文件的类型 我的utf8 提交资料的时候 需要在mysql_query上加这么语句话

 代码如下 复制代码
mysql_query("SET NAMES 'utf8'",$db);  

  然后数据库的编码也得是utf8_general_ci  

然后在读取的时候 也加

 代码如下 复制代码
mysql_query("SET NAMES 'utf8'",$db);  

   然后就不会实现乱码了 以下代码是是实例

 代码如下 复制代码

<?php
mysql_query("SET NAMES 'utf8'",$db);
$sql = "select * from wd_sql";
$query=mysql_query($sql);
 $i = 1;//www.111cn.net
 while ($result = mysql_fetch_array($query)) {
 $x = $i++;
 echo "第".$x."位<br>";}
?>


总结一下这个乱码问题的解决方法:

1.确认所有页面都统一使用同样的编码,强烈建议用utf-8;
2. 在用mysql_query作查询时无论是写入数据到mysql还是从mysql提数据出来,设置mysql_query(“set names utf8″)..,连接数据库时就设置,而且不要把这时的“utf8”写成“utf-8”,这点很重要。

magic_quotes_gpc是一个php中一个给单双引号增加一些安全过滤的函数,但此函数对于我使用unserialize函数时会产生一些影响,下面我就就这个问题与大家看几个实例与解决办法。

昨天朋友让我帮他解决下他网站的购物车程序的问题,程序用的是PHPCMS,换空间前是好的(刚换的空间),具体问题是提示成功加入购物车后跳转到购物车页面,购物车里为空。

我看了下代码,大致的原理就是将产品ID与数量存放到数组中,然后序列化后存入COOKIE中,在购物车页面反序列化COOKIE,得到这个数组并读出对应产品信息。

调试一下发现问题出现在unserialize上。

我先根据它的购物车原理写了段代码:

 

 代码如下 复制代码
<?php  
    header("Content-type: text/html; charset=utf-8");  
    $magic = get_magic_quotes_gpc() ? "开启" : "未开启";  
     
    $str = array(array('goods_id'=>13,'number'=>1));  
    setcookie("cart", serialize($str));  
    echo "magic_quotes_gpc: ".$magic."<br>";  
    echo $_COOKIE['cart']."<br>";  
    print_r(unserialize($_COOKIE['cart']));  
?> 


大家执行下这段代码可以发现,当你的magic_quotes_gpc关闭时这段程序执行没有任何问题,但是magic_quotes_gpc开启时你会发现反序列化并不成功。这时你可能就知道问题出在哪了?

原因是magic_quotes_gpc开启时,系统会自动对POST GET COOKIE的结果中的单引号进行转义,加上\,所以$_COOKIE['cart']的值就变成了a:1:{i:0;a:2:{s:8:\"goods_id\";i:13;s:6:\"number\";i:1;}},这样的话unserialize是无法反序列化成功的,就出现了问题。

解决的办法简单来说就是将unserialize($_COOKIE['cart'])改成unserialize(stripslashes($_COOKIE['cart'])),在COOKIE前加上stripslashes,去掉转义符。这样就没问题了。

对于cookie影响我们再做个测试

1.问题:项目数据需要序列化保存在cookie中,然后再获得cookie的数据反序列,获得原数据

 代码如下 复制代码


    $a[0] = array("key"=>"哈  逻"); 
    $a[1] = array("key"=>"哈 逻"); 
    $jsona = json_encode($a); 
    setcookie("testcookie","");  //www.111cn.net
    setcookie("testcookie",$jsona); 
    var_dump($jsona,true); //正常取值 
    var_dump(json_decode($_COOKIE['testcookie'],true)); //取不到值 


在没有经过cookie赋值时,正常反序列化。经过cookie之后,取到值为空

2.分析:

 

 代码如下 复制代码
    $a[0] = array("key"=>"哈  逻"); 
    $a[1] = array("key"=>"哈 逻"); 
    $jsona = json_encode($a); 
    var_dump($jsona); //string(50) "[{"key":"\u54c8 \u903b"},{"key":"\u54c8 \u903b"}]" 
    setcookie("testcookie",""); 
    setcookie("testcookie",$jsona); 
    var_dump($_COOKIE['testcookie']); // string(62) "[{\"key\":\"\\u54c8 \\u903b\"},{\"key\":\"\\u54c8 \\u903b\"}]" 
    var_dump(json_decode($_COOKIE['testcookie'],true)); 


对比了一下数据,经过cookie处理后多了几个//

解决方法:

 代码如下 复制代码


    var_dump(json_decode(stripslashes($_COOKIE['testcookie']),true)); 
    var_dump(json_decode(str_replace("\\","",$_COOKIE['testcookie']),true)); 


总结:magic_quotes_gpc在开启的情况下,会影响通过get|post|cookies获得的数据.所以我们在get|post|cookies处理数据的时候,
首先判断magic_quotes_gpc开启情况
1>在开启情况下,处理数据需要stripslashes
2>在没有开启情况下,接受数据先addslashes,处理数据stripslashes

在linux中增加了fastcgi+php环境,结果在文件上传时如果文件小于100KB是可以上传,但大了点就提示mod_fcgid: HTTP request length 132296 (so far) exceeds MaxRequestLen (131072)错误了,意思是fastcgi限制了文件上传大小而你要上传的文件比maxrequestlen还要大啊,所以不能上传想上传就得修改一下配置了,具体步骤如。

最近在项目中中上传图片时,大约有300多K,结果报了个服务器错误,以前从未遇到过,错误的内容如下:

点击查看原图

mod_fcgid: www.111cn.net HTTP request length 132296 (so far) exceeds MaxRequestLen (131072)

查了下资料,发现fastcgi默认的请求大小为131072,于是在apache配置中添加了MaxRequestLen 配置就好了。如果你只需要修改单个虚拟主机的MaxRequestLen,原来是fastcgi模式下的设置问题,需要在配置文件.htaccess或者直接在apache的配置文件http.conf 中指明,如下:

 代码如下 复制代码

<IfModule mod_fcgid.c>
  AddHandler    fcgid-script .fcgi
  FcgidConnectTimeout  20
  # to get around upload errors when uploading images increase the MaxRequestLen size to 15MB
  FcgidMaxRequestLen  15728640
</IfModule>


如果你是php+apache windows环境下的话我们如下配置即可

在php.ini中找到

upload_max_filesize,及其他post_max_size、max_input_time、memory_limit、 max_execution_time配置

把上传大小修改之后重启apache 即可解决。

 

[!--infotagslink--]

相关文章

  • Java如何发起http请求的实现(GET/POST)

    这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
  • 解决Java处理HTTP请求超时的问题

    这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
  • C#模拟http 发送post或get请求的简单实例

    下面小编就为大家带来一篇C#模拟http 发送post或get请求的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • Element PageHeader页头的使用方法

    这篇文章主要介绍了Element PageHeader页头的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-27
  • spring cloud gateway中如何读取请求参数

    这篇文章主要介绍了spring cloud gateway中如何读取请求参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-15
  • C# 重写ComboBox实现下拉任意组件的方法

    C#种的下拉框ComboBox不支持下拉复选框列表与下拉树形列表等,系统中需要用到的地方使用了第三方组件,现在需要将第三方组件替换掉。这篇文章主要介绍了C# 重写ComboBox实现下拉任意组件的相关资料,需要的朋友可以参考下...2020-06-25
  • C#处理和对接HTTP接口请求的方法

    下面通过四步给大家介绍了c#处理和对接http接口请求的方法,分步骤介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看下吧...2020-06-25
  • 使用Feign消费服务时POST/GET请求方式详解

    这篇文章主要介绍了使用Feign消费服务时POST/GET请求方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-25
  • SpringMvc自动装箱及GET请求参数原理解析

    这篇文章主要介绍了SpringMvc自动装箱及GET请求参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
  • RestTemplate实现发送带headers的GET请求

    这篇文章主要介绍了RestTemplate实现发送带headers的GET请求,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-30
  • SpringMvc获取请求头请求体消息过程解析

    这篇文章主要介绍了SpringMvc获取请求头请求体消息过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-17
  • PHP中header()函数有什么用?常见header 状态

    在php中header()函数是很大的作用可以发送各种状态代码,也可以实现一些输出下载,下面我们一起来看看一些相关实例吧。 什么是头信息? 这里只作简单解释,详细的自己看...2016-11-25
  • PHP如何使用cURL实现Get和Post请求

    这篇文章主要介绍了PHP如何使用cURL实现Get和Post请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-11
  • C#中重载与重写区别分析

    这篇文章主要为大家详细介绍了C#中重载与重写的区别,感兴趣的小伙伴们可以参考一下...2020-06-25
  • C#网络请求与JSON解析的示例代码

    这篇文章主要介绍了C#网络请求与JSON解析的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • vue 接口请求地址前缀本地开发和线上开发设置方式

    这篇文章主要介绍了vue 接口请求地址前缀本地开发和线上开发设置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-13
  • Spring MVC 处理一个请求的流程

    Spring MVC是Spring系列框架中使用频率最高的部分。不管是Spring Boot还是传统的Spring项目,只要是Web项目都会使用到Spring MVC部分。因此程序员一定要熟练掌握MVC部分。本篇博客简要分析Spring MVC处理一个请求的流程。...2021-02-06
  • 详解AngularJS中$http缓存以及处理多个$http请求的方法

    $http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据,通过本文给大家介绍AngularJS中$http缓存以及处理多个$http请求的方法,希望的朋友一起学习吧...2016-02-12
  • PHP中的cURL请求及示例学习笔记

    cURL是php中一个很强大的功能,可以模仿各种用户请求,如模仿用户登录,发送php cookie等等操作,下面我来整理一些相关的方法与各位同学看看 备注:使用curl_init函数,必须...2016-11-25
  • Python基于httpx模块实现发送请求

    这篇文章主要介绍了Python基于httpx模块实现发送请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-08