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 相关文章推荐
Zend公司全球首推PHP认证
Oct 09 PHP
php 在线打包_支持子目录
Jun 28 PHP
PHP strncasecmp字符串比较的小技巧
Jan 04 PHP
PHP 读取大文件的X行到Y行内容的实现代码
Jun 24 PHP
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
Apr 29 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
Jun 30 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
Oct 21 PHP
注释PHP和html混合代码的小技巧(分享)
Nov 03 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
Nov 05 PHP
php array_udiff_assoc 计算两个数组的差集实例
Nov 12 PHP
TP5框架请求响应参数实例分析
Oct 17 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 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
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
2018/10/12 PHP
详解在YII2框架中使用UEditor编辑器发布文章
2018/11/02 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
javascript date格式化示例
2013/09/25 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
BootStrap制作导航条实例代码
2016/05/06 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
vuex 使用文档小结篇
2018/01/11 Javascript
10分钟上手vue-cli 3.0 入门介绍
2018/04/04 Javascript
详解Nodejs mongoose
2018/06/10 NodeJs
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
[44:01]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS paiN
2018/03/31 DOTA
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
Python 中使用 PyMySQL模块操作数据库的方法
2019/11/10 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
快速创建python 虚拟环境
2020/11/28 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
HTML5 body设置全屏背景图片的示例代码
2020/12/08 HTML / CSS
zooplus波兰:在线宠物店
2019/07/21 全球购物
英语专业毕业生自荐信
2013/10/28 职场文书
周年庆典邀请函范文
2014/01/24 职场文书
2014年社区植树节活动方案
2014/02/28 职场文书
低碳环保倡议书
2014/04/14 职场文书
婚庆答谢词
2015/01/04 职场文书
消防演习通知
2015/04/25 职场文书
浅谈golang 中time.After释放的问题
2021/05/05 Golang
spring boot项目application.properties文件存放及使用介绍
2021/06/30 Java/Android
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技