代码改变世界

TP SEO

2011-05-19 15:46  卫佳  阅读(299)  评论(0编辑  收藏  举报

 

我们来通过一个简单的例子,分别用URL路由、空操作和空模块三个角度来实现,由此来看ThinkPHP对SEO和URL友好的支持到底有多方便。
因为URL_REWRITE比较特殊,需要服务器支持,所以下面的例子不涉及URL_REWRITE,所以比较具有通用性。
例子说明如下:
如果我们有一个City模块,而我们希望能够通过类似下面这样的URL地址来访问具体某个城市的操作:
http://<serverName>/index.php/City/shanghai/  

一、使用URL路由功能实现
由于shanghai这个操作方法是不存在的,我们给相关的城市操作定义了一个city方法,如下:

  1. Class CityAction extends Action{
  2. public function city(){
  3. // 读取城市名称
  4. $cityName = $_GET[‘name’];
  5. Echo (‘当前城市:’.$cityName);
  6. }
  7. }

复制代码

接下来我们来定义路由文件,实现类似于
http://<serverName>/index.php/City/shanghai/ discount louis vuitton handbags
这样的解析,路由文件名称是routes.php 放在项目的Conf目录下面,内容如下:
Return array(
‘City’=>array(‘City’,’city’,’name’);
);
这样,URL里面所有的City模块(其实已经不是City模块了,而是一个路由定义)都会被路由到City模块的city操作,而后面的第二个参数会被解析成 $_GET[‘name’]
接下来,我们就可以在浏览器里面输入
http://<serverName>/index.php/City/beijing/
http://<serverName>/index.php/City/shanghai/
http://<serverName>/index.php/City/shenzhen/
会看到依次输出的结果是:
当前城市:beijing
当前城市:shanghai
当前城市:shenzhen

二、空操作实现
同样是上面的例子,我们用空操作的思路来实现。
我们定义了一个CityAction类,代表了City模块,而我们希望能够通过类似下面这样的URL地址来访问具体某个城市的操作:
http://<serverName>/index.php/City/shanghai/
由于第二个参数表示的含义是City模块的操作名称,我们不可能给每个城市都定义一个操作方法,那样的工作量将是相当巨大的(尤其是在中国,呵呵~),当 然,我们可以利于URL路由功能来解决这个问题。但是我们还可以用空操作来更加高效地解决这个问题,我们来看下具体如何实现。
我们只需要给CityAction类定义一个_emtpy (空操作)方法:

Class CityAction extends Action{
Public function _empty(){
// 把所有城市的操作都解析到city方法
// 注意city方法本身是protected方法
$cityName = ACTION_NAME;
$this->city($cityName);
}
Protected function city($name){
// 和$name 这个城市相关的处理
Echo (‘当前城市:’.$name);
}
}

接下来,我们就可以在浏览器里面输入discount nike air shoes
http://<serverName>/index.php/City/beijing/
http://<serverName>/index.php/City/shanghai/
http://<serverName>/index.php/City/shenzhen/
会看到依次输出的结果是:
当前城市:beijing
当前城市:shanghai
当前城市:shenzhen

三、空模块实现
现在需求进一步,要求我们把URL由原来的
http://<serverName>/index.php/City/shanghai/
变成
http://<serverName>/index.php/shanghai/
这样更加简单的方式,如果按照传统的模式,我们必须给每个城市定义一个Action类,然后在每个Action类的index方法里面进行处理。
可是如果使用空模块功能,这个问题就可以迎刃而解了。
我们可以给项目定义一个EmptyAction类

Class EmptyAction extends Action{
Public function index(){
// 根据当前模块名称来判断要执行哪个城市的操作
$cityName = MODULE_NAME;
$this->city($cityName);
}
Protected function city($name){
// 和$name 这个城市相关的处理
Echo (‘当前城市:’.$name);
}
}

接下来,我们就可以在浏览器里面输入
http://<serverName>/index.php/beijing/
http://<serverName>/index.php/shanghai/
http://<serverName>/index.php/shenzhen/
会看到依次输出的结果是:
当前城市:beijing
当前城市:shanghai
当前城市:shenzhen