Xerdoc网站静态化备忘
那天在看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:
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
You don’t have permission to access /web/zhcn/shell.php on this server.
本以为是权限的问题,其实不是,而是由于Server的httpd.conf中将FollowSymLinks禁止了,也就是禁止了符号链接。来看看Apache Document中对FollowSymLinks的定义:
FollowSymLinks
The server will follow symbolic links in this directory.
Even though the server follows the symlink it does not change the pathname used to match against <Directory> sections.
Note also, that this option gets ignored if set inside a <Location> section.
因此,我们需要在.htaccess中进行设定:
Options FollowSymLinks
ok,再试试,结果还是有问题:
Not Found
The requested URL /u/www.xerdoc.com/web/zhcn/shell.php was not found on this server.
这是因为没有设置Rewrite的Base设置,在.htaccess中加上下面的设置:
RewriteBase /web/zhcn/
一切正常。
可以看到,利用Apache的URL Rewrite模块来进行URL美化,不用更改代码,同时,也可以一定程度上的隐藏后台的实现,屏蔽将来内部设计的变化,缺点就是带来效率上的损失。
.htaccess还可以控制该目录下文件的访问权限,这里不多说,需要注意的是这个文件自己也需要保护起来:一种是用文档的自己的权限,另一种是在.htaccess中添加以下部分:
<Files .htaccess>
order allow,deny
deny from all
</Files>
参考资料:
URL Rewriting Engine - Apache.org
Search Engine Friendly的URL设计 - 车东
Search Engine Friendly PHP Pages - John Coggeshall
Apache的Mod_rewrite学习 - 竹笋炒肉
修改历史:
2005.06.12 - 创建
2005.06.13 - 增加 .htaccess 的自保护
Popularity: 38%
Related entries:
- No Related Posts

June 12th, 2005 at 10:44 pm
写手啊,强
June 13th, 2005 at 12:54 pm
立此存照,以免忘记,呵呵
November 21st, 2005 at 11:31 pm
[…] 孟岩和他的 Web Calendars Booming http://www.mengyan.org/blog/archives/2005/06/28/25.html Xerdoc网站静态化备忘 http://www.mengyan.org/blog/archives/2005/06/12/16.html 看完后,收益非浅 PHP iCalendar http://phpiiCalendar.net […]
February 9th, 2006 at 5:22 pm
[…] Meng Yan ( 孟岩 ) @ Weblog » Blog Archive » Xerdoc网站静态化备忘 (tags: blog technic search) […]
June 13th, 2006 at 7:24 pm
谢谢~真是受益非浅~