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实现手机归属地查询API接口实现代码
Aug 27 PHP
php获取通过http协议post提交过来xml数据及解析xml
Dec 16 PHP
基于Zend的Config机制的应用分析
May 02 PHP
php 修改、增加xml结点属性的实现代码
Oct 22 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
PHP实现单例模式最安全的做法
Jun 13 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
Nov 11 PHP
浅析PHP文件下载原理
Dec 25 PHP
深入解析PHP的Yii框架中的event事件机制
Mar 17 PHP
PHP编写daemon process 实例详解
Nov 13 PHP
php 开发中加密的几种方法总结
Mar 22 PHP
php使用curl模拟多线程实现批处理功能示例
Jul 25 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 DOS攻击实现代码(附如何防范)
2012/05/29 PHP
php防止sql注入代码实例
2013/12/18 PHP
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
把input初始值不写value的具体实现方法
2013/07/04 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
JS判断是否360安全浏览器极速内核的方法
2015/01/29 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
javascript基本语法
2016/05/31 Javascript
jquery中的常见问题及快速解决方法小结
2016/06/14 Javascript
JS获取随机数和时间转换的简单实例
2016/07/10 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
Eclipse + Python 的安装与配置流程
2013/03/05 Python
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
使用Python 统计高频字数的方法
2019/01/31 Python
python字符串循环左移
2019/03/08 Python
python版DDOS攻击脚本
2019/06/12 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
八年级语文教学反思
2014/02/11 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
基石观后感
2015/06/12 职场文书
python中tkinter复选框使用操作
2021/11/11 Python