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 相关文章推荐
实现分十页分向前十页向后十页的处理
Oct 09 PHP
第十节--抽象方法和抽象类
Nov 16 PHP
php 高效率写法 推荐
Feb 21 PHP
php5.2以下版本无json_decode函数的解决方法
May 25 PHP
在PHP中运行Linux命令并启动SSH服务的例子
Jun 12 PHP
PHP实现利用MySQL保存session的方法
Aug 23 PHP
PHP输出XML格式数据的方法总结
Feb 08 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
Jan 21 PHP
PHP使用XMLWriter读写xml文件操作详解
Jul 31 PHP
tp5框架基于ajax实现异步删除图片的方法示例
Feb 10 PHP
php在linux环境中如何使用redis详解
Dec 15 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回溯法解决0-1背包问题实例分析
2015/03/23 PHP
学习PHP session的传递方式
2016/06/15 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
uploadify 3.0 详细使用说明
2012/06/18 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
2013/10/15 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
jQuery实现流动虚线框的方法
2015/01/29 Javascript
关于js二维数组和多维数组的定义声明(详解)
2016/10/02 Javascript
js实现音频控制进度条功能
2017/04/01 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
Python中实现结构相似的函数调用方法
2015/03/10 Python
python开发之str.format()用法实例分析
2016/02/22 Python
深入理解Python中的super()方法
2017/11/20 Python
Python3一行代码实现图片文字识别的示例
2018/01/15 Python
Python tkinter三种布局实例详解
2020/01/06 Python
pytorch数据预处理错误的解决
2020/02/20 Python
Python实现从N个数中找到最大的K个数
2020/04/02 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
python爬虫中采集中遇到的问题整理
2020/11/27 Python
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
经济管理专业毕业生自荐信范文
2014/01/02 职场文书
初中音乐教学反思
2014/01/12 职场文书
培训通知
2015/04/17 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书
解析原生JS getComputedStyle
2021/05/25 Javascript
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技