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会员权限控制实现原理分析
May 29 PHP
如何使用Strace调试工具
Jun 03 PHP
php根据身份证号码计算年龄的实例代码
Jan 18 PHP
thinkphp普通查询与表达式查询实例分析
Nov 24 PHP
php递归实现无限分类的方法
Jul 28 PHP
PHP实现抓取迅雷VIP账号的方法
Jul 30 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
Aug 18 PHP
php pthreads多线程的安装与使用
Jan 19 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
Mar 24 PHP
Laravel推荐使用的十个辅助函数
May 10 PHP
laravel框架邮箱认证实现方法详解
Nov 22 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 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
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
2007/03/24 Javascript
Jquery 一次处理多个ajax请求的代码
2011/09/02 Javascript
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
JS中关于正则的巧妙操作
2017/08/31 Javascript
Mint UI 基于 Vue.js 移动端组件库
2017/11/07 Javascript
JS高级技巧(简洁版)
2018/07/29 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
基于JavaScript伪随机正态分布代码实例
2019/11/07 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
[01:45]典藏宝瓶2+祈求者身心——这就是DOTA2TI9总奖金突破3000万美元的秘密
2019/07/21 DOTA
python图像处理之镜像实现方法
2015/05/30 Python
在类Unix系统上开始Python3编程入门
2015/08/20 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
Spring实战之使用util:命名空间简化配置操作示例
2019/12/09 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
使用Pycharm分段执行代码
2020/04/15 Python
详解CSS3中border-image的使用
2015/07/18 HTML / CSS
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
高中生的自我鉴定范文
2014/01/24 职场文书
大学社团活动策划书
2014/01/26 职场文书
学习十八大报告感言
2014/02/28 职场文书
本科毕业生自荐信
2014/06/02 职场文书
面试自我评价范文
2014/09/17 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
聘任合同书
2015/09/21 职场文书
Tomcat弱口令复现及利用
2022/05/06 Servers