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 相关文章推荐
Win2000+Apache+MySql+PHP4+PERL安装使用小结
Oct 09 PHP
PHP 数字左侧自动补0
Mar 31 PHP
Godaddy空间Zend Optimizer升级方法
May 10 PHP
Linux编译升级php的详细方法
Nov 04 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
Feb 23 PHP
使用symfony命令创建项目的方法
Mar 17 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
Jun 13 PHP
详谈php静态方法及普通方法的区别
Oct 04 PHP
php连接mysql数据库
Mar 21 PHP
thinkPHP显示不出验证码的原因与解决方法分析
May 20 PHP
PHP数组遍历的几种常见方式总结
Feb 15 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
Feb 22 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 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
经验几则 推荐
2006/09/05 Javascript
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
原生js和jQuery写的网页选项卡特效对比
2015/04/27 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
jQuery获取cookie值及删除cookie用法实例
2016/04/15 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
JS基于递归实现倒计时效果的方法
2016/11/26 Javascript
浅谈javascript alert和confirm的美化
2016/12/15 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
Python数据可视化:泊松分布详解
2019/12/07 Python
Python正则表达式如何匹配中文
2020/05/27 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
我们是伦敦女孩:WalG
2018/01/08 全球购物
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
领导干部群众路线对照检查材料
2014/11/05 职场文书