从nginx日志分析搜索引擎爬行记录

截至今天,google对摩迹网的收录已经达到5250,而百度仍然只收录首页,而且是3月21号的首页!

为了搞清楚为什么,要查询nginx访问日志,看看百度的蜘蛛有没有来爬过,下面几个命令可以做到:

1. 百度蜘蛛来访次数

[root@localhost 04]# cat access_molgee_20110403.log |grep Baiduspider+ | wc

访问次数.jpg

这里的第一个数字435就是百度蜘蛛访问的次数,可见在4月3号它来了435次,爬了我这么多页面却不更新收录?继续分析:

2. 讲百度蜘蛛访问过的页面按访问频率倒序显示

[root@localhost 04]# cat access_molgee_20110403.log |grep Baiduspider+ | awk '{print $7}' | sort | uniq -c | sort -r

频率.jpg

啊,似乎找到原因了,因为molgee上线之前我把域名指向了我的博客,百度收录了其中一些页面,而现在这些页面已经访问不了,全部会定向到error.html,也许是这个原因。当然更有可能是,我在博客里贬了好几次百度,比如这篇《我们为什么要用百度》,所以你可以看到它爬这篇文章的频率仅次于robots.txt

从JavaEye创办者robbin的微博上就可以看到百度这么干的先例

robin微博.jpg

多可笑,如果真的是后者,我无话可说,欺负创业者就是中国首富最爱干的事儿,下面再转一位创业者的微博

baidu.jpg

如果是前者

除了祝李彦宏先生的女儿为她的父亲感到骄傲,我所能做的只有等待,等着哪天百度的搜索结果中能出现摩迹两个字,或者是销售人员打来电话告诉我我需要交点保护费才能不k我的站。

对了,上面两条命令,把Baiduspider+ 改成Googlebot或者别的什么蜘蛛的名字就能查看对应的记录。

我查了查,google每天要来爬1400多页,作为程序员,我更喜欢用数据说话。

Nginx的目录权限配置

通常,如果我们打开autoindex选项,那么当用户访问一个没有默认文件的目录时,会以资源浏览器的方式让用户查看,显然这是不安全的。

在Nginx下,要禁止用户查看文件夹结构,可以通过deny all来完成,Nginx会返回一个403错误。

按照ThinkPHP的推荐的部署配置,目录结构应该是这个样子:

Project
      ├─ App
      ├─ Public
      ├─ ThinkPHP
      └─ index.php

从安全角度考虑,我们不希望用户访问到App和ThinkPHP目录,那么可以如下配置

# 禁止访问App和ThinkPHP目录
location ~ ^.*/(App|ThinkPHP)/ {
	deny all;
}

对于公共目录Public,会存放用户上传的文件,所以当然要禁止php文件的执行,配置如下

# 不解释Public目录下的php
location ~ ^.*/Public/(.*\.php)?$ {
        deny all;
}

如此一来,Public目录不能直接访问,并且其下的php文件都不能执行,但是图片等其它文件又可以被访问到。

配置Nginx支持ThinkPHP的URL重写和PATHINFO

ThinkPHP支持通过PATHINFO和URL rewrite的方式来提供友好的URL,只需要在配置文件中设置 'URL_MODEL' => 2 即可。在Apache下只需要开启mod_rewrite模块就可以正常访问了,但是Nginx中默认是不支持PATHINFO的,所以我们需要修改nginx.conf文件。

网上搜了很多方法都不奏效,研究了一天,发现通过以下的配置可以完美支持 'URL_MODEL' => 2 的情况了

location /project/ {
	index  index.php;
	if (!-e $request_filename) { 
		rewrite  ^/project/(.*)$  /project/index.php/$1  last;
		break;
	}
}

location ~ .+\.php($|/) {
	set $script	$uri;
	set $path_info  "/";
	if ($uri ~ "^(.+\.php)(/.+)") {
		set $script     $1;
		set $path_info  $2;
	 }
		 
	fastcgi_pass 127.0.0.1:9000;
	fastcgi_index  index.php?IF_REWRITE=1;
	include /APMServ/nginx/conf/fastcgi_params;
	fastcgi_param PATH_INFO $path_info;
	fastcgi_param SCRIPT_FILENAME  $document_root/$script;
	fastcgi_param SCRIPT_NAME $script;
}

这里先把project下的请求都转发到index.php来处理,亦即ThinkPHP的单一入口文件;然后把对php文件的请求交给fastcgi来处理,并且添加对PATH_INFO的支持。

重启Nginx以后,http://localhost/project/Index/insert, http://localhost/project/index.php/Index/delete 这样的URL都可以正确访问了。

还有一个地方需要注意的是,Nginx配置文件里 if 和后面的括号之间要有一个空格,不然会报unknown directive错误。这个害我调了很久