PHP Curl出现403错误的解决办法


Posted in PHP onMay 29, 2014

自己用的小PHP应用,使用curl抓网页下来处理,为了穿墙方便,使用Privoxy作为代理,便于选择哪些网站使用proxy、哪些不用。但今天却遇到了奇怪的问题,访问google baidu这些网站居然都返回403错误,而访问其他的一些网站没事,如果设置为不使用proxy则都能正常访问。

难道google baidu就不让用proxy连接么?显然不可能,所以打开curl的信息输出(curl_setopt($this->mSh, CURLOPT_VERBOSE, 1);)看看,得到以下结果:

*   Trying 127.0.0.1... * connected
* Connected to 127.0.0.1 (127.0.0.1) port 8118 (#0)
* Establish HTTP proxy tunnel to www.baidu.com:80
> CONNECT www.baidu.com:80 HTTP/1.0
Host: www.baidu.com:80
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Proxy-Connection: Keep-Alive
< HTTP/1.0 403 Connection not allowable
< X-Hint: If you read this message interactively, then you know why this happens ,-)
< 
* The requested URL returned error: 403
* Received HTTP code 403 from proxy after CONNECT
* Closing connection #0
... Failed.

可以看到proxy服务器工作正常,的确是baidu返回了403错误,但原因肯定还在我这边。终于,从网上(1of2, 2of2)得到了点启发──我使用的是proxytunnel而非proxy。

在代码中,有这么一句:

 curl_setopt($this->mSh, CURLOPT_HTTPPROXYTUNNEL, true);
 curl_setopt($this->mSh, CURLOPT_PROXY, $phost);

php文档中没有详细说明,不过man curl中有详细解释,两者都是代理,proxytunnel(-p参数)允许其他协议通过http代理传输,而proxy(-x参数)则只能走http协议。所以我猜测,google baidu的服务器和curl的proxytunnel不和,所以返回403。

禁用掉上面2行代码的第一句后,curl访问恢复正常。

比较奇怪的是,几种操作系统下还不一样,一台MAC OSX就要显式的禁用proxytunnel才可以,curl版本:

$ curl --version
curl 7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Protocols: tftp ftp telnet dict ldap http file https ftps 
Features: GSS-Negotiate IPv6 Largefile NTLM SSL libz

而另外一台ubuntu则完全不受影响,怎么都能用,curl版本:
$ curl --version
curl 7.18.2 (i486-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.10
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

MT主机上的centos也没事,curl版本:
$ curl --version
curl 7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Protocols: tftp ftp telnet dict ldap http file https ftps 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

看来不完全是curl版本问题,MAC OSX的确与众不同啊。

还有一个原因也会导致curl返回403错误,如果设置了:

 curl_setopt($ch, CURLOPT_NOBODY, true);

则需要紧跟着设置:
 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

不然会因为http服务器不允许 HEAD 命令而返回403错误。参考:Trouble with a cURL request in PHP(http://forums.devshed.com/php-development-5/trouble-with-a-curl-request-in-php-445222.html)。MAC OSX上curl之所以特殊,也不排除是这种原因吧。
PHP 相关文章推荐
社区(php&amp;&amp;mysql)一
Oct 09 PHP
PHP简介
Oct 09 PHP
fleaphp crud操作之find函数的使用方法
Apr 23 PHP
用来解析.htpasswd文件的PHP类
Sep 05 PHP
使用PHP实现蜘蛛访问日志统计
Jul 05 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
Jan 26 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
Jun 23 PHP
Windows7下的php环境配置教程
Feb 28 PHP
typecho插件编写教程(五):核心代码
May 28 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
php实现文章评论系统
Feb 18 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
Oct 09 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
May 29 #PHP
神盾加密解密教程(一)PHP变量可用字符
May 28 #PHP
CI框架开发新浪微博登录接口源码完整版
May 28 #PHP
PHP+javascript制作带提示的验证码源码分享
May 28 #PHP
微信支付开发教程(一)微信支付URL配置
May 28 #PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
May 28 #PHP
php轻松实现中英文混排字符串截取
May 28 #PHP
You might like
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
2014/11/25 PHP
php 类自动载入的方法
2015/06/03 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
jQuery中slice()方法用法实例
2015/01/07 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
js实现图片3D轮播效果
2019/09/21 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
2020/08/27 Javascript
Python strip lstrip rstrip使用方法
2008/09/06 Python
python中bisect模块用法实例
2014/09/25 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
django query模块
2019/04/20 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
Python作用域与名字空间原理详解
2020/03/21 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
详解python中的闭包
2020/09/07 Python
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
公务员转正鉴定材料
2014/02/11 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
党员干部廉政承诺书
2015/04/28 职场文书
学生会部长竞选稿
2015/11/19 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL
Python turtle实现贪吃蛇游戏
2021/06/18 Python
PHP正则表达式之RCEService回溯
2022/04/11 PHP