首頁 php教程 php手册 解决php curl获取网页内容提示405 method not allowed状态码

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

Jun 02, 2016 am 09:14 AM
method

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

<?php

/**

 * http测试

 * 注:PHP版本5.2以上才支持CURL_IPRESOLVE_V4

 * @param $url 网站域名

 * @param $type 网站访问协议

 * @param $ipresolve 解析方式

 */

public function web_http($url, $type, $ipresolve) {

    //设置Header头

    $header[] = "Accept: application/json";

    $header[] = "Accept-Encoding: gzip";

    $httptype = function_exists(&#39;curl_init&#39;);

    if (!$httptype) {

        $html = file_get_contents($url);

    } else {

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);

        //输出头信息

        curl_setopt($ch, CURLOPT_HEADER, 1);

        //递归访问location跳转的链接,直到返回200OK

        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

        //不对HTML中的BODY部分进行输出

        curl_setopt($ch, CURLOPT_NOBODY, 1);

        //将结果以文件流的方式返回,不是直接输出

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        //以IPv4/IPv6的方式访问

        if ($ipresolve == &#39;ipv6&#39;) {

            curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);

        } else {

            curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

        }

        //添加HTTP header头采用压缩和GET方式请求

        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

        curl_setopt($ch, CURLOPT_ENCODING, "gzip");

        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &#39;GET&#39;);

        //清除DNS缓存

        curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 0);

        //设置连接超时时间

        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);

        //设置访问超时

        curl_setopt($ch, CURLOPT_TIMEOUT, 50);

        //设置User-agent

        curl_setopt($ch, CURLOPT_USERAGENT, &#39;Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11&#39;);

        if ($type == "https") {

            //不对认证证书来源的检查

            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

            //从证书中检查SSL加密算法是否存在

            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);

        }

        //执行Curl操作

        $html = curl_exec($ch);

        //获取一个cURL连接资源句柄的信息(获取最后一次传输的相关信息)

        $info = curl_getinfo($ch);

        curl_close($ch);

    }

    return $info;

}

登入後複製

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

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

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

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

ipv6增加了如下代码:

1

2

3

4

5

6

7

//设置Header头

$header[] = "Accept: application/json";

$header[] = "Accept-Encoding: gzip";

//添加HTTP header头采用压缩和GET方式请求

curl_setopt( $ch, CURLOPT_HTTPHEADER, $header );

curl_setopt($ch,CURLOPT_ENCODING , "gzip");

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &#39;GET&#39;);

登入後複製

//命令行的形式为:

curl -v www.phprm.com

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<?php

$ch = curl_init();

curl_setopt ($ch, CURLOPT_URL, $url);

curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

//设置curl默认访问为IPv4

if(defined(&#39;CURLOPT_IPRESOLVE&#39;) && defined(&#39;CURL_IPRESOLVE_V4&#39;)){

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

}

//设置curl请求连接时的最长秒数,如果设置为0,则无限

curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

//设置curl总执行动作的最长秒数,如果设置为0,则无限

curl_setopt ($ch, CURLOPT_TIMEOUT,$timeout*3);

$file_contents = curl_exec($ch);

curl_close($ch);

登入後複製

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


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)