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+FLASH实现上传文件进度条相关文件 下载
Jul 21 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
Sep 25 PHP
php日历制作代码分享
Jan 20 PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 PHP
ThinkPHP3.1基础知识快速入门
Jun 19 PHP
两种php给图片加水印的实现代码
Apr 18 PHP
浅析Yii2 GridView实现下拉搜索教程
Apr 22 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
May 17 PHP
yii2-GridView在开发中常用的功能及技巧总结
Jan 07 PHP
php基于PDO实现功能强大的MYSQL封装类实例
Feb 27 PHP
PHP面向对象程序设计之对象的遍历操作示例
Jun 12 PHP
基于Laravel 5.2 regex验证的正确写法
Sep 29 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
德劲1104的电路分析与改良
2021/03/01 无线电
PHP实现用户认证及管理完全源码
2007/03/11 PHP
php快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
用js遍历 table的脚本
2008/07/23 Javascript
一些不错的js函数ajax
2008/08/20 Javascript
javascript各种复制代码收集
2008/09/20 Javascript
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
学习ExtJS table布局
2009/10/08 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
javascript进行数组追加方法小结
2014/06/16 Javascript
js密码强度检测
2016/01/07 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
js实现删除li标签一行内容
2019/04/16 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
Python及PyCharm下载与安装教程
2017/11/18 Python
python调用opencv实现猫脸检测功能
2019/01/15 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
Visual Studio code 配置Python开发环境
2020/09/11 Python
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
建筑设计学生的自我评价
2014/01/16 职场文书
优秀教师主要事迹
2014/02/01 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
2014年党风廉政建设工作总结
2014/11/19 职场文书
2016年春节问候语
2015/11/11 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS
go:垃圾回收GC触发条件详解
2021/04/24 Golang