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网站备份程序代码分享
Jun 10 PHP
php中批量删除Mysql中相同前缀的数据表的代码
Jul 01 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
Jun 25 PHP
phpmailer中文乱码问题的解决方法
Apr 22 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
Jun 21 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
Sep 30 PHP
Paypal实现循环扣款(订阅)功能
Mar 23 PHP
PHP缓存工具XCache安装与使用方法详解
Apr 09 PHP
PHP实现上传图片到数据库并显示输出的方法
May 31 PHP
PDO::inTransaction讲解
Jan 28 PHP
Thinkphp页面跳转设置跳转等待时间的操作
Oct 16 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 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缓冲 output_buffering的使用详解
2013/06/13 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
PHP获取访问设备信息的方法示例
2019/02/20 PHP
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
setInterval计时器不准的问题解决方法
2014/05/08 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
Bootstrap Search Suggest使用例子
2016/12/21 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
2017/04/05 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
最基础的vue.js双向绑定操作
2017/08/23 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
vue-cli3.X快速创建项目的方法步骤
2019/11/14 Javascript
用Angular实现一个扫雷的游戏示例
2020/05/15 Javascript
通过vue刷新左侧菜单栏操作
2020/08/06 Javascript
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
wxPython使用系统剪切板的方法
2015/06/16 Python
Python操作Access数据库基本步骤分析
2016/09/19 Python
利用pandas读取中文数据集的方法
2018/07/25 Python
python爬虫实现中英翻译词典
2019/06/25 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
品管员岗位职责
2013/11/10 职场文书
关于爱情的广播稿
2014/01/16 职场文书
公共场所禁烟标语
2014/06/25 职场文书
超强台风观后感
2015/06/09 职场文书
贷款收入证明格式
2015/06/24 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL