当前位置:  编程技术>php

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

    来源: 互联网  发布时间:2014-08-26

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

自己用的小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 Fatal error: Cannot redeclare class or function
  • PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
  • PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
  • php iis7站长之家
  • PHP错误Cannot use object of type stdClass as array in错误的解决办法
  • linux下配置PHP 编译的时候出现错误
  • 装好mysql,apache后,再装php,配置httpd.conf时出现了如下错误!
  • php syntax error, unexpected $end 错误怎么解决
  • 实现Nginx中使用PHP-FPM时记录PHP错误日志的配置方法
  • php出现内存位置访问无效错误问题解决方法
  • 配置PHP环境的时候autoconf-2.61,提示configure错误
  • 求助:第一次装apache+php,运行站点出现403错误!
  • php的慢速日志引起的Mysql错误问题分析
  • php弹出错误警告函数
  • PHP代码错误:急!!!急!!急!!!Fatal error: Call to undefined function: dbase_open() 怎么解决???????????? 100在
  • PHP捕获Fatal error错误的方法
  • PHP中Fatal error session_start()错误解决步骤
  • PHP启动报错 php提示SNMP错误的解决方法
  • 非常实用的php弹出错误警告函数扩展性强
  • php错误Undefined variable: 如何解决
  • PHP Parse Error: syntax error, unexpected $end 错误解决办法
  • php出现Class 'XsltProcessor' not found问题的解决方法
  • php读取富文本的时p标签会出现红线是怎么回事
  • linux系统运行php几分钟后出现假死情况请问需要设置什么地方?
  • PHP6 中可能会出现的新特性预览
  • PHP出现Warning: scandir()问题的解决方法
  • php数组函数之array_count_values() 统计数组中所有值出现的次数
  • php字符串查找 查找字符最后一次出现位置
  • PHP统计字符串中单词出现次数的函数
  • php页面空白怎么回事 php出现空白页的解决方法
  • php出现空白页面怎么办
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 救命.PHP没有办法调用MYSQL!!!!
  • PHP empty函数报错解决办法
  • PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
  • nginx:413 Request Entity Too Large的处理办法--修改 PHP上传文件大小
  • php.ini save_handler 修改不生效的解决办法
  • 100分求救,关于 apache+mysql+php的整合办法
  • PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
  • php smarty truncate UTF8乱码问题解决办法
  • PHP中Session引起的脚本阻塞问题解决办法
  • PHP使用Session遇到的一个Permission denied Notice解决办法
  • PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
  • php fsockopen解决办法 php实现多线程
  • PHP base64编码后解码乱码的解决办法
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • IIS7配置PHP图解(IIS7+PHP_5.2.17/PHP_5.3.5)
  • PHP 5.4.19 和 PHP 5.5.3 发布及下载地址
  • php输入流php://input使用示例(php发送图片流到服务器)
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • PHP转换器 HipHop for PHP
  • PHP去除html标签,php标记及css样式代码参考
  • PHP 框架 Pop php
  • PHP 'ext/soap/php_xml.c'不完整修复存在多个任意文件泄露漏洞
  • PHP的JavaScript框架 PHP.JS
  • php通过socket_bind()设置IP地址代码示例
  • php服务器探针显示php服务器信息
  • php安装完成后如何添加mysql扩展
  • PHP缓存加速器 Alternative PHP Cache (APC)
  • PHP的substr() 函数用法
  • PHP源文件加密工具 PHP Screw
  • PHP介绍及学习网站推荐
  • PHP自动化测试 PHP-QAT


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3