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 CKEditor 上传图片实现代码
Nov 06 PHP
PHP安全配置详细说明
Sep 26 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
Jun 05 PHP
php define的第二个参数使用方法
Nov 04 PHP
php一维二维数组键排序方法实例总结
Nov 13 PHP
PHP获取Exif缩略图的方法
Jul 13 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
Aug 31 PHP
PHP实现的DES加密解密实例代码
Apr 06 PHP
PHP读取mssql json数据中文乱码的解决办法
Apr 11 PHP
laravel学习教程之关联模型
Jul 30 PHP
php魔术方法功能与用法实例分析
Oct 19 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
Oct 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 图片上传类代码
2009/07/17 PHP
php 定义404页面的实现代码
2012/11/19 PHP
php生成二维码
2015/08/10 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
filemanage功能中用到的lib.js
2007/04/08 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
jquery动态添加删除一行数据示例
2014/06/12 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
jquery制作多功能轮播图插件
2015/04/02 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
jquery+php实现滚动的数字特效
2015/11/29 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
2016/03/29 Javascript
JS产生随机数的几个用法详解
2016/06/22 Javascript
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
详解vue-cli 脚手架项目-package.json
2017/07/04 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
简单实现js进度条加载效果
2020/03/25 Javascript
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
2017/11/28 Javascript
详解webpack编译多页面vue项目的配置问题
2017/12/11 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
Python获取央视节目单的实现代码
2015/07/25 Python
python字符类型的一些方法小结
2016/05/16 Python
Mac 上切换Python多版本
2017/06/17 Python
mac在matplotlib中显示中文的操作方法
2020/03/06 Python
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
幼儿园教师节活动方案
2014/02/02 职场文书
婚前财产公证书
2014/04/10 职场文书
联谊活动总结
2014/08/28 职场文书
2014年宣传工作总结
2014/11/18 职场文书
狼牙山五壮士观后感
2015/06/09 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js