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

suchasplus

普通会员
2008-12-15
33
5
32
www.renwenyue.com
#1
所谓的语义化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中

ForceType application/x-httpd-php

这样名为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解析方法

原文地址:http://www.renwenyue.com/2008/10/uri-pretty-and-url-mapping-with-apache-and-php-how-to.html:mah (chilling):
 
顶部 底部