当前位置:首页 > PHP教程 > php应用 > 列表

解决php curl获取网页内容提示405 method not allowed状态码

发布:smiling 来源: PHP粉丝网  添加日期:2014-09-21 15:29:31 浏览: 评论:0 

在使用php curl获取网页内容有些网站提示405 method not allowed状态码了,这个问题我分析了出问题的网站是因为ipv6而导致了,所以我们只要简单的调整一下就可以解决这个问题了,下面一起来看看吧.

1.php curl ipv4使用例子,代码如下:

  1. /** 
  2.  * http测试 
  3.  * 注:PHP版本5.2以上才支持CURL_IPRESOLVE_V4 
  4.  * @param $url 网站域名 
  5.  * @param $type 网站访问协议 
  6.  * @param $ipresolve 解析方式 
  7.  */ 
  8. public function web_http($url,$type,$ipresolve) { 
  9. //设置Header头 
  10. $header[] = "Accept: application/json"
  11.   $header[] = "Accept-Encoding: gzip"
  12. $httptype = function_exists('curl_init'); 
  13. if (!$httptype) { 
  14. $html = file_get_contents($url); 
  15. else { 
  16. $ch = curl_init(); 
  17. curl_setopt($ch, CURLOPT_URL, $url); 
  18. //输出头信息 
  19. curl_setopt($ch, CURLOPT_HEADER, 1); 
  20. //递归访问location跳转的链接,直到返回200OK 
  21. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
  22. //不对HTML中的BODY部分进行输出 
  23. curl_setopt($ch, CURLOPT_NOBODY, 1); 
  24. //将结果以文件流的方式返回,不是直接输出 
  25. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  26. //以IPv4/IPv6的方式访问 
  27. if($ipresolve=='ipv6') { 
  28. curl_setopt($ch,CURLOPT_IPRESOLVE,CURL_IPRESOLVE_V6); 
  29. }else
  30. curl_setopt($ch,CURLOPT_IPRESOLVE,CURL_IPRESOLVE_V4); 
  31. //添加HTTP header头采用压缩和GET方式请求 
  32. curl_setopt( $ch, CURLOPT_HTTPHEADER, $header ); 
  33. curl_setopt($ch,CURLOPT_ENCODING , "gzip"); 
  34. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); 
  35. //清除DNS缓存 
  36. curl_setopt($ch,CURLOPT_DNS_CACHE_TIMEOUT,0); 
  37. //设置连接超时时间 
  38. curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,15); 
  39. //设置访问超时 
  40. curl_setopt($ch,CURLOPT_TIMEOUT,50); 
  41. //设置User-agent 
  42. curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11'); 
  43. if($type=="https") { 
  44. //不对认证证书来源的检查 
  45. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
  46. //从证书中检查SSL加密算法是否存在   
  47. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); 
  48. }//开源软件:phpfensi.com 
  49. //执行Curl操作 
  50. $html = curl_exec($ch); 
  51. //获取一个cURL连接资源句柄的信息(获取最后一次传输的相关信息) 
  52. $info = curl_getinfo($ch); 
  53. curl_close($ch); 
  54. return $info

上面代码在ipv4是没有任何问题了,如果在了ipv6网站就会返回405 method not allowed状态码了,那么我们查看了php手册发现只要简单的修改一下即可.

以上为我编写的一个基本curl访问的方法,因为我这里需要通过使用IPv6的方式,所以加了相应的选项,相信大家能看的明白,平时经常用到的选项上面都有出现,大家根据需要摘取.

405/Method Not Allowed,表示不支持请求的方法,这个错误不常见.

导致403错误是要是由于curl默认是用post方式进行提交访问的,post方式在此域名下是没有权限的,如我在测试www.phpfensi.com的时候就出现了此问题,在我修改为get的方式,并且增加了header头后,即可正常访问,个人推测,或许是亚马逊那边基本上都是采用get的方式,才会被认为是人为的点击,对post做了相应屏蔽.

ipv6增加了如下代码:

  1. //设置Header头 
  2. $header[] = "Accept: application/json"
  3. $header[] = "Accept-Encoding: gzip"
  4. //添加HTTP header头采用压缩和GET方式请求 
  5. curl_setopt( $ch, CURLOPT_HTTPHEADER, $header ); 
  6. curl_setopt($ch,CURLOPT_ENCODING , "gzip"); 
  7. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); 
  8. //命令行的形式为: 
  9. curl -v www.phpfensi.com 

IPV6下curl超时问题,代码如下:

  1. <?php 
  2. $ch = curl_init(); 
  3. curl_setopt ($ch, CURLOPT_URL, $url); 
  4. curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); 
  5. //设置curl默认访问为IPv4 
  6. if(defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')){ 
  7. curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 
  8. //设置curl请求连接时的最长秒数,如果设置为0,则无限 
  9. curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
  10. //设置curl总执行动作的最长秒数,如果设置为0,则无限 
  11. curl_setopt ($ch, CURLOPT_TIMEOUT,$timeout*3); 
  12. $file_contents = curl_exec($ch); 
  13. curl_close($ch); 
  14. ?> 

注:curl_setopt($ch,CURLOPT_IPRESOLVE,CURL_IPRESOLVE_V4) 只有在php版本5.3及以上版本,curl版本7.10.8及以上版本时,以上设置才生效.

Tags: curl获取网页内 提示405 method

分享到: