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 相关文章推荐
腾讯QQ php程序员面试题目整理
Jun 08 PHP
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
Mar 01 PHP
YII中assets的使用示例
Jul 31 PHP
yii的CURD操作实例详解
Dec 04 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
深入浅析PHP7.0新特征(五大新特征)
Oct 29 PHP
php远程下载类分享
Apr 13 PHP
PHP实现链式操作的原理详解
Sep 16 PHP
PHP实现的文件操作类及文件下载功能示例
Dec 24 PHP
[原创]php实现数组按拼音顺序排序的方法
May 03 PHP
PHP实现数组和对象的相互转换操作示例
Mar 20 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 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实现返回JSON和XML的类分享
2015/01/28 PHP
浅谈PHP中Stream(流)
2015/06/08 PHP
PHP接收json 并将接收数据插入数据库的实现代码
2015/12/01 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
JavaScript中的普通函数与构造函数比较
2015/04/07 Javascript
JS中Location使用详解
2015/05/12 Javascript
Vue.js表单控件实践
2016/10/27 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
Node.JS文件系统解析实例详解
2017/05/15 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
Swiper.js实现移动端元素左右滑动
2019/09/08 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
在Python程序中实现分布式进程的教程
2015/04/28 Python
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
python 如何在测试中使用 Mock
2021/03/01 Python
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
兰蔻法国官方网站:Lancôme法国
2020/02/22 全球购物
工地资料员岗位职责
2013/12/31 职场文书
大学生村官事迹材料
2014/01/21 职场文书
面试后感谢信怎么写
2014/02/01 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
python爬取某网站原图作为壁纸
2021/06/02 Python
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android