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

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

1.php curl ipv4使用例子

 代码如下复制代码

/**

* 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('curl_init');

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=='ipv6') {

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, 'GET');

//清除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,'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11');

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.111cn.net的时候就出现了此问题,在我修改为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, 'GET');

命令行的形式为:

curl -v www.111cn.net

IPV6下curl超时问题

 代码如下复制代码

$ch = curl_init();

curl_setopt ($ch, CURLOPT_URL, $url);

curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

//设置curl默认访问为IPv4

if(defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')){

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值