解决php curl获取网页内容提示405 method not allowed状态码

1.php curl ipv4使用例子

 代码如下 复制代码

/**
 * 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;
}

上面代码在ipv4是没有任何问题了,如果在了ipv6网站就会返回405 method not allowed状态码了,那么我们查看了php手册发现只要简单的修改一下即可。

以上为我编写的一个基本curl访问的方法,因为我这里需要通过使用IPv6的方式,所以加了相应的选项,相信大家能看的明白,平时经常用到的选项上面都有出现,大家根据需要摘取。

405/Method Not Allowed,表示不支持请求的方法,这个错误不常见。

导致403错误是要是由于curl默认是用post方式进行提交访问的,post方式在此域名下是没有权限的,如我在测试www.111cn.net的时候就出现了此问题,在我修改为get的方式,并且增加了header头后,即可正常访问,个人推测,或许是亚马逊那边基本上都是采用get的方式,才会被认为是人为的点击,对post做了相应屏蔽。

ipv6增加了如下代码:

 代码如下 复制代码

//设置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.111cn.net

IPV6下curl超时问题

 代码如下 复制代码

<?php

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
//设置curl默认访问为IPv4
if(defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')){
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
}
//设置curl请求连接时的最长秒数,如果设置为0,则无限
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
//设置curl总执行动作的最长秒数,如果设置为0,则无限
curl_setopt ($ch, CURLOPT_TIMEOUT,$timeout*3);
$file_contents = curl_exec($ch);
curl_close($ch);

 
注:curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4) 只有在php版本5.3及以上版本,curl版本7.10.8及以上版本时,以上设置才生效。

时间: 2025-01-24 17:42:58

解决php curl获取网页内容提示405 method not allowed状态码的相关文章

php采用curl访问域名返回405 method not allowed提示的解决方法_php技巧

/** * 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-E

cxf restful 错误 HTTP 405 Method Not Allowed

问题描述 cxf restful 错误 HTTP 405 Method Not Allowed 初次使用cxf+restful 遇到错误 javax.ws.rs.ClientErrorException: HTTP 405 Method Not Allowed,有谁帮忙看看 测试的客户端和服务端的类: public class MyClient { public static void main(String[] args) throws Exception { //go("http://loc

Nginx HTTP Post Method: 405 Method not allowed错误

最近维护一台RedHat 5.4 X64系统,环境是Nginx,跑着一个论坛,需要向HTML页面提交POST数据,结果都被拦截下来了,显示错误:"nginx 405 Not Allowed",是乎没有很好的解决办法,唯一能做的就是重新编译Nginx源码和编辑conf文件. 后来得知Apache.IIS.Nginx等绝大多数web服务器,都不允许静态文件响应POST请求,否则会返回"HTTP/1.1 405 Method not allowed"错误 需要修改Ngin

使用jqgrid没有数据,前台样式也有问题,url报405(Method Not Allowed)

问题描述 使用jqgrid没有数据,前台样式也有问题,url报405(Method Not Allowed) 下面是servlet public void ajaxTriggerList(HttpServletRequest request, HttpServletResponse response) throws Exception{ List> results = this.schedulerService .getQrtzTriggers(); String page = request.

php curl获取网页内容(IPV6下超时)的解决办法

如果开启了IPv6,curl默认会优先解析 IPv6,在对应域名没有 IPv6 的情况下,会等待 IPv6 dns解析失败 timeout 之后才按以前的正常流程去找 IPv4   原因:在程序中我对curl获取内容都作了较为严格的超时限制,所以就会造成无法获取内容的问题. 解决方法:设置默认访问为ipv4.php的curl设置方法如下: 复制代码 代码如下: <?php /** * IPV6下curl超时问题 */ $ch = curl_init(); curl_setopt ($ch, CU

php解决ipv6使curl获取网页内容超时解决办法

问题原因: 如果开启了IPv6,curl默认会优先解析 IPv6,在对应域名没有 IPv6 的情况下,会等待 IPv6 dns解析失败 timeout 之后才按以前的正常流程去找 IPv4.在程序中我对curl获取内容都作了较为严格的超时限制,所以就会造成无法获取内容的问题. 解决的方法是设置默认访问为ipv4,php的curl设置方法具体如下  代码如下 复制代码 $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_set

php curl获取网页内容(IPV6下超时)的解决办法_php技巧

原因:在程序中我对curl获取内容都作了较为严格的超时限制,所以就会造成无法获取内容的问题. 解决方法:设置默认访问为ipv4.php的curl设置方法如下: 复制代码 代码如下: <?php/*** IPV6下curl超时问题*/$ch = curl_init();curl_setopt ($ch, CURLOPT_URL, $url);curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);//设置curl默认访问为IPv4if(defined('CU

SVN 错误;: Server sent unexpected return value (405 method not allowed)

原因:上面有一个已经建立的同名文件夹了,只要删除同名中的一个就很好解决了!

Nginx静态文件响应POST请求 提示405错误的解决方法_nginx

例1:用linux下的curl命令发送POST请求给Apache服务器上的HTML静态页 复制代码 代码如下: [root@localhost ~]# curl -d 11=1 http://www.jb51.net/index.html    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">   <HTML>       <HEAD>           <TITLE>405 Meth