·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设问答 >> 站长工具开源分析之HTTP状态头查询原理与代码

站长工具开源分析之HTTP状态头查询原理与代码

作者:佚名      网站建设问答编辑:admin      更新时间:2022-07-23

通常站长朋友们会比较关心网站的404状态、301状态、302等状态,有时候302跳转可能被判为作弊,所以检测是301还是302比较重要,另外如果首页看似可以正常访问,但返回的不是200状态码,对搜索引擎来讲可能存在一些问题!同样,如果设置网站404错误页面时,如果采用跳转,设置不当,返回状态为302也会存在一些问题。

一般会到一些站长工具上去查询,落叶在早期制作站长工具时,通过很多方式思考过这些状态是怎么查询到的,原理是什么,PHP上怎样才能检测到网站页面的状态是不是404等。

本文作为落叶对站长工具“开源分析”系列文章的一部分,对HTTP状态查询的方法进行一些总结,希望大家有兴趣关注。

当用户在浏览器中输入一条网址,敲下回车后,浏览器向网址所在的服务器发出请求,服务器通过一些处理后,将信息返回给浏览器,浏览器再显示出来。服务器返回的信息中就有一部分包含HTTP状态码,那么就包含我们所熟悉的404状态,200状态,301状态等。

我们使用一些浏览器手抓包工具如httpwatch、finder等,通常会观察到返回的HTTP头信息大概如下:

HTTP/1.1 200 OK

Content-Length: 35264

Content-Type: text/html

Content-Location: http://www.pmume.com/index.html

Last-Modified: Sat, 13 Aug 2011 03:27:37 GMT

Accept-Ranges: bytes

ETag: "742a1f36859cc1:6c6bc"

Server: Microsoft-IIS/6.0

X-Powered-By: ASP.NET

Date: Sat, 13 Aug 2011 12:18:05 GMT

其中大家一眼就能看到200状态。

那么从站长工具程序角度来看,大概我们需要做的是先能程序去自动访问目标页面,然后抓取返回的HTTP头信息,然后通过正则或者某些方式对返回的头信息进行处理,提取其中的状态头。

我们首先想到的是PHP自带的函数get_headers:

<?php

$url = 'http://www.example.com';

print_r(get_headers($url));

?>

即可得上述状态头信息,但实际使用中WIN平以下效率非常低,查询慢不说,经常查询失败,起初落叶考虑采用循环查询多次,直至成功的方式来返回结果。效果肯定不会太理想,所以重新考虑到更好的方法。

考虑到HTTP状态检测的过程实际也是采集的过程,采集的利器curl应该有更好的方法,一翻研究了解到PHP CURL中有一个提取HTTP头的函数curl_getinfo,不需经过特殊处理直接缓存干净地HTTP头数组,并且稳定比较好。具体代码如下:

<?php

$url=http://www.***.com;

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url);

curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);

curl_setopt ($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");

curl_setopt($curl, CURLOPT_HEADER, 1);//设置采集HTTP头信息

curl_setopt($curl, CURLOPT_NOBODY, 0);//设置不采集内部部分

curl_setopt($curl,CURLOPT_ENCODING, "gzip, deflate");

$data=curl_exec($curl);

$m=curl_getinfo($curl);//处理返回内容获到HTTP头数组信息

curl_close($curl);

if(empty($data)){

return 'fail';

}

echo $m['http_code'];

}

?>

返的$m数组中直接输出$m[‘http_code’]即得到了HTTP状态头。

当然CURL函数的使用,需要服务器开启PHP_CURL扩展,下面是对CURL扩展开启方法的介绍:

1、  将PHP文件夹下的三个文件php_curl.dll,libeay32.dll,ssleay32.dll复制到system32下; 

2、  将php.ini(c:WINDOWS目录下)中的;extension=php_curl.dll中的分号去掉; 

3、  重启apache或者IIS。

作者:落叶(t.qq.com/guohui) 网站:http://www.pmume.com

落叶原创,首发CHINAZ,尊重版权,转载请注明出处