php采用curl访问域名返回405 method not allowed提示的解决方法


Posted in PHP onJune 26, 2014
/**
 * 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;
  }

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

状态码提示405/Method Not Allowed表示不支持请求的方法,这个错误并不常见。

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

对此增加了如下代码:

//设置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.amazon.cn
PHP 相关文章推荐
PHP 高手之路(二)
Oct 09 PHP
zend framework配置操作数据库实例分析
Dec 06 PHP
浅析51个PHP处理字符串的函数
Aug 02 PHP
destoon文章模块调用企业会员资料的方法
Aug 22 PHP
浅谈php冒泡排序
Dec 30 PHP
php通过分类列表产生分类树数组的方法
Apr 20 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 PHP
PHP中include()与require()的区别说明
Feb 14 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
Jul 19 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
详细解读php的命名空间(一)
Feb 21 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 #PHP
Thinkphp使用mongodb数据库实现多条件查询方法
Jun 26 #PHP
ThinkPHP页面跳转success与error方法概述
Jun 25 #PHP
修改ThinkPHP缓存为Memcache的方法
Jun 25 #PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
Jun 25 #PHP
ThinkPHP多表联合查询的常用方法
Mar 24 #PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
Jun 25 #PHP
You might like
Js动态创建div
2008/09/25 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
javascript类型转换示例
2014/04/29 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
Google 地图获取API Key详细教程
2016/08/06 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
jQuery封装animate.css的实例
2018/01/04 jQuery
vue 指定组件缓存实例详解
2018/04/01 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
使用JS代码实现俄罗斯方块游戏
2018/08/03 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
python删除文件示例分享
2014/01/28 Python
深入源码解析Python中的对象与类型
2015/12/11 Python
Python构造自定义方法来美化字典结构输出的示例
2016/06/16 Python
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
使用Python构造hive insert语句说明
2020/06/06 Python
英国最大的邮寄种子和植物公司:Thompson & Morgan
2017/09/21 全球购物
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
大学生村官座谈会发言材料
2014/05/25 职场文书
怎样写离婚协议书
2014/09/10 职场文书
作风建设年度心得体会
2014/10/29 职场文书
面试必问:圣杯布局和双飞翼布局的区别
2021/05/13 HTML / CSS
python字典的元素访问实例详解
2021/07/21 Python
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL