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 远程关机实现代码
Nov 10 PHP
PHP学习笔记 (1) 环境配置与代码调试
Jun 19 PHP
如何利用PHP执行.SQL文件
Jul 05 PHP
PHP三元运算的2种写法代码实例
May 12 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
Jun 21 PHP
php利用cookies实现购物车的方法
Dec 10 PHP
PHP中使用xmlreader读取xml数据示例
Dec 29 PHP
PHP中使用Imagick实现各种图片效果实例
Jan 21 PHP
php显示指定目录下子目录的方法
Mar 20 PHP
PHP调用接口用post方法传送json数据的实例
May 31 PHP
laravel 多图上传及图片的存储例子
Oct 14 PHP
laravel ajax curd 搜索登录判断功能的实现
Apr 17 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 MYSQL中插入当前时间
2008/04/06 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
PHP写UltraEdit插件脚本实现方法
2011/12/26 PHP
php代码收集表单内容并写入文件的代码
2012/01/29 PHP
PHP的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
php引用和拷贝的区别知识点总结
2019/09/23 PHP
JSON JQUERY模板实现说明
2010/07/03 Javascript
JS原型对象通俗"唱法"
2012/12/27 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
jquery实现的鼠标拖动排序Li或Table
2014/05/04 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
JavaScript用200行代码制作打飞机小游戏实例
2017/06/21 Javascript
Angular整合zTree的示例代码
2018/01/24 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
javascript闭包的使用之按钮切换功能
2018/08/30 Javascript
通过微信公众平台获取公众号文章的方法示例
2019/12/25 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
python 调用c语言函数的方法
2017/09/29 Python
Python3爬楼梯算法示例
2019/03/04 Python
Python3进制之间的转换代码实例
2019/08/24 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
深入分析python 排序
2020/08/24 Python
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
银行出纳岗位职责
2013/11/25 职场文书
购房意向书
2014/04/01 职场文书
2015年上半年党建工作总结
2015/03/30 职场文书
心得体会格式及范文
2016/01/25 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记