接连看到关于搜索引擎倾向于索引静态网页的文章,甚是不以为然,直至多次登陆google等搜索引擎均失败,才意识到静态url的重要性。这不现在聆听小区的文章都改成准静态的了(准静态好像是一个热力学概念)。
转静态,可以采用生成静态文件的缓冲方法,但对于已经做好为动态的网站,这种方法不大经济。而且对于少访问量的网站,生成静态文件的代价就不菲。我觉得对于现成的动态网站,最小代价还是把url装饰成静态即可。
网站放在虚拟主机上,各种rewriter估计是用不成了,只好试试path_info。经过初步试验证实在向服务器提交(就是在IE地址栏中输入)诸如http://smccom.3322.org/hknng/archive.php/category/10.html的url时,如果网站上存在/hknng/archive.php这个文件,那么服务器就会执行这个文件并把结果返回给浏览器,并且在archive.php中,可以截获后面的/category/10.html这个所谓的path_info(可以通过$_SERVER['PATH_INFO']获得,也可以用substr($_SERVER['REQUEST_URI'], strlen($_SERVER['SCRIPT_NAME']))得到)。于是问题就变成在archive.php中如何处理后面的path_info了。
解释器本来命名index.php是很自然的事,但是这样产生的静态url未免太裸,唯恐天下人不知道你的静态url背后是动态的。而写成archive.php,这就好像是一个文件夹,存放php文件的归档。然后在index.php中写一句header("Location: archive.php/index.html");就行了。反正就算用index.php作解释器,如果要首页静态化,当index.php被裸着访问时也要立即重定向到index.php/index.html之类。
对于本小区,有三个部分需要静态化:首页,各版块文章列表,各文章。
一种简单的处理办法是在解释器archive.php中用switch语句判断是访问以上哪一类,然后把上面三个动态文件的代码复制粘贴到相应的case子句中,再稍作调整。这样做一个很不好的地方就是将来可能会对三部分之一的动态文件进行修改,这时就要相应修改解释器archive.php中的相应部分。既然三个部分已经有现成写好的代码可以工作,我们应该尽量想办法利用它们。
另一种方法是如果服务器允许文件函数打开远程文件(即url),则可以用readfile()函数读出动态url的结果并输出。例如:readfile("http://www.somesite.com/somedynamic.php?id=".$intId)来达到url影射的目的。这样做使得客户端只有一个请求,而服务器端却接收到了两个请求。对于不涉及登陆及用cookie进行身份验证的网站,这也是一种不错的方法,只要服务器能承受加倍了的http请求。但由于用readfile()函数作url影射时是服务器向自己提交请求,无法将客户端的cookie等信息附带发送,所以在使用cookie的网站上用此种方法会产生问题。一种解决的办法是用readfile()提交请求时通过url把所需的客户信息也一并发送,例如readfile("http://www.somesite.com/somedynamic.php?id=".$intId."&username=".$_COOKIE["username"]."&password=".$_COOKIE["password"])。显然这种方法有潜在的安全问题,如果用户知道动态页面的地址和参数,他就可以通过构造url参数username和password达到cookie欺骗的目的。
最后一种方法是用include把动态文件包含进来,这样动态文件在执行时就能获得cookie等客户端信息。这种方法需要对动态文件作一点修改。首先在解释器中用define语句定义一个常量,例如INSUI。然后动态文件中通过判断INSUI是否已定义,决定是从$_GET中取得参数,还是从解释器定义的变量中取得参数。此种方法比较安全,因为常量无法在站外的文件中被定义,所以只要你只在解释器中定义INSUI,则动态文件中判断到INSUI已定义时,可以保证文件是被解释器include而不是别的文件。
转成静态url以后能否被搜索引擎收录呢?只好慢慢等了。
用户登录






