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

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

WBOY
WBOYOriginal
2016-06-02 09:14:041765Durchsuche

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

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

<?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增加了如下代码:

//设置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超时问题,代码如下:

<?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及以上版本时,以上设置才生效.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn