PHP实现语义化URL的方法和思路

| No Comments | No TrackBacks
所谓的语义化url,就是拿来一个url, 让非技术人员看一眼,大体上就能猜测出来是什么意思,也可以说是url美化, url mapping, url映射, uri pretty, Search Engine-Friendly URLs等等。
url美化车东的说法,url mapping则java味道很浓, uri prettySearch Engine-Friendly URLs貌似是著名的sitepoint的说法。
绝大部分站点实现语义化URL,基本上都是因为SEO的需要。以SitePoint讲解语义化URL实现的文章为例,
http://www.sitepoint.com/article/search-engine-friendly-urls/3/
这个URL基本上可以等同与
http://www.sitepoint.com/article.php?title=Search-Engine-Friendly-URLs&page=3

总结了一下,以example.com/handler.php?user=username&action=do&num=3这种URL
Apache以mod方式运行PHP实现语义化URL基本有以下几种形式:
1. /handler/username/do/3/
     1)使用url rewrite,在Apache启用Mod_rewrite来实现,这个是最简单的。
缺点在于:全部rewrite的负载都扔给Apache或者其他前端了。可以考虑使用Nginx/Squid/Lighttpd来做七层交换, Nginx是目前比较适用的7层交换工具,相比价格昂贵却性能底下令人诟病的F5七层芯片,每秒2~3万瞬发连接,70W并发连接而稳定服务的Nginx@CentOS & Gentoo是一个性价比足够高方案
    2)在Apache中, 设定ErrorDocument 404 /processor.php,  processor.php中第一行就是header("HTTP/1.1 200 OK"); , 然后再怎么处理REQUEST_URI是程序的事情了, 单点入口。
      缺点是accesslog全转到errorlog了,这个还是要处理的
    3)Apache中
        <Files article> 
        ForceType application/x-httpd-php 
        </Files>
    这样名为handler的php文件就可以解析到参数了。
    缺点是所有文件都经过php引擎来解析,性能上会相对低下。
2. /index.php/handler-username-do-3/
 index.php能接收到$_SERVER['path_info'], 作为单一入口很容易做MVC等的解析
3. /?handler-username-do-3.html
打印$_SERVER可以看到, query_string可以拿到handler-username-do-3.html部门,去除掉.html就可以通过默认的DirectoryIndex(比如index.php)来解析了


第一种和第二种URL都是通过实现folder的效果来实现向搜索引擎表达默认静态页的效果,第三种则是相对简单的伪·静态化实现方案。
我个人比较推崇第一种方案的第一个实现,让系统来实现7层交换,便于隐藏技术细节,也便于后台技术切换。
相比Apache+PHP的配置,Java和Python实现语义化的URL相比来说简单多了,这个算是原理上的差异吧。

这里有一个比较简单的MVC解析方法

No TrackBacks

TrackBack URL: http://blog.suchasplus.com/mt/mt-tb.cgi/200

Leave a comment

About this Entry

This page contains a single entry by suchasplus published on October 15, 2008 2:45 PM.

攒RP攒RP - 记几则好人好事 - 囧 was the previous entry in this blog.

一篇比较PHP下MySQL和Oracle数据库性能的文章,比较有意思 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.

Pages

OpenID accepted here Learn more about OpenID
Powered by Movable Type 5.2.7