Posted in 互联网, Xerdoc at June 12th, 2005
| 5 Comments »
那天在看Xerdoc网站统计的时候突然发现,Google的机器人每次来了只索引了了几个页面,内容很少。突然想起,Google的机器人似乎不索引这些带有Get参数的URL,这就意味着这些URL、包括这些页面涉及的URL都不会被索引,这就导致了整个网站被索引的量很低。
这是因为普遍认为互联网上静态页面的价值大于动态页面-尤其是这些带有参数的动态页面,其它搜索引擎也大多如此。
因此,面向搜索引擎来设计网站的一个很重要的方式就是网站的页面静态化。静态化通常有两种方式:一种是通常CMS支持的,将内容真正以静态的方式发布,这种方式的典范是MovableType,它的面向搜索引擎的设计堪称经典;第二种方式是用“静态化的URL”(URL美化)来替换这些动态的URL,其实就是“骗骗”这个Google的小机器人,让他认为我们的URL是一个静态页面。
用URL美化来提高搜索引擎的友好度主要有两种方式:1)URL Rewriting;2)PATH_INFO,车东和John Coggeshall在这方面都有很好的文章。
Search Engine Friendly的URL设计 - 车东
Search Engine Friendly PHP Pages - John Coggeshall
URL Rewriting主要是利用Apache中的rewrite_module来实现URL的重写(IIS中也有相应的模块,具体见此)。简单的说,该Module就是一个采用正则表达式进行分析,替换的Filter,来实时的改变用户请求的URL。改写的规则可以定义在服务器范围内(httpd.conf)、目录范围内(.htaccess),因为一般的虚拟主机不允许我们修改httpd.conf,所以我们只能来修改每个目录内的.htaccess文件了。但是从效率上来说,httpd.conf内定义的规则只在Apache启动的时候进行加载,所以效率很高,而.htaccess中定义的规则,在每次URL访问的时候都要重新访问此文件,大大的降低了效率。
利用URL Rewriting进行静态化的效果非常好,比如,Xerdoc中的静态化就是这样:
home.html -> shell.php?pos=home
竹笋炒肉的《Apache的Mod_rewrite学习》详细的介绍了 rewrite_module工作的原理,如果您感兴趣,可以看看。
另一种进行URL美化的方式就是采用PATH_INFO。PATH_INFO是一CGI的标准,一般的虚拟主机都有支持(在没有PATH_INFO支持的情况下,可以试试这样得到PATH_INFO:
$PATH_INFO= substr($_SERVER[’REQUEST_URI’],strlen($_SERVER[’SCRIPT_NAME’]), strlen($_SERVER[’REQUEST_URI’]));
)。PATH_INFO的主要原理是:当Server访问的页面或者目录不存在的时候,会依次访问“/”前面的文件,直到找到能够访问的文件为止。Web Server同时会创建一个名位 $PATH_INFO的变量,来记录除此文件外的其它URL信息。比如:
shell.php/pos/home 这个URL,最后访问的实际文件是 shell.php,而PATH_INFO的值是 /pos/home
这样,在PHP脚本中,可以解析这个PATH_INFO的值,得到相应的参数。
周六正好有时间,于是用静态的URL重构一下网站,来提高搜索引擎的友好度。(最近还有一个想法是重新用XHTML标准重构一下网站,完全用CSS来定义风格,忙完这阵子和曹飞商量一下)。
Xerdoc的服务器架设在name2host.com上,服务很是一般。本来想当然的以为不会支持rewrite_module来进行改造,就开始尝试PATH_INFO来进行改造。
像前面介绍的那样,在代码中解析PATH_INFO,然后再利用解析后的参数进行查询。比如 shell.php/pos/home 这个URL,PATH_INFO的值为 /pos/home,然后可以得到每个参数。
list($dummy, $first, $last) = explode(’/', $PATH_INFO)
这里需要注意的是,第一个参数为空,所以我们用dummy来存。
过程很简单,不过出现了意料之外的问题-相对路径(Relative Path)的问题。
比如shell.php中的CSS和Image文件都存在同级的images文件夹中,而引用的图片也都采用诸如“<img src=”images/image.gif”>”这样的相对路径方式,但是通过“shell.php/pos/home”这样的URL来访问的话,图像的实际路径变成了 “shell.php/pos/images/image.gif”,显然是错误的。
想来想去,有几种解决方案:
1)采用绝对路径来引用图片,修改量比较大,而且这些绝对信息将会引起将来重构或者搬移的难度;
2)计算PATH_INFO中的路径层数,在图像引用路径前面加上N(路径层数)个“../”,从而找到正确路径;
3)设置 BASE HREF 为该文档的真正URL,具体见此;
4)统一入口,统一所有资源文件的位置。
车东提到可以参考wiki中的资源处理方式,等忙过这段,需要学习再来补充。:-)
这样看来,利用PATH_INFO来进行改造,需要修改的地方比较多,于是突然想起,何不试试Xerdoc的Server能否支持Apache的Rewrite Module。于是,在需要静态化的目录中加了一个简单的.htaccess文件,内容如下:
RewriteEngine On
RewriteRule (.+)\.html$ shell\.php?pos=$1 [L]
然后开始访问,结果遇到下面的错误:
Forbidden
[…]
Popularity: 42%