SEO工具、SEO教程、SEM教程、SEO培训、SEO优化、SEO服务、SEM服务等方面的资料,让大家掌握更多搜索引擎优化、网站优化等方面的知识。

2008年11月25日星期二

从URL路由、空操作和空模块看ThinkPHP对SEO的支持

从URL路由、空操作和空模块看ThinkPHP对SEO的支持
我们来通过一个简单的例子,分别用URL路由、空操作和空模块三个角度来实现,由此来看ThinkPHP对SEO和URL友好的支持到底有多方便。
因为URL_REWRITE比较特殊,需要服务器支持,所以下面的例子不涉及URL_REWRITE,所以比较具有通用性。
例子说明如下:
如果我们有一个City模块,而我们希望能够通过类似下面这样的URL地址来访问具体某个城市的操作:
http:///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:///index.php/City/shanghai/
这样的解析,路由文件名称是routes.php 放在项目的Conf目录下面,内容如下:
代码: 复制内容到剪贴板

1. Return array(
2. ‘City’=>array(‘City’,’city’,’name’);
3. );

这样,URL里面所有的City模块(其实已经不是City模块了,而是一个路由定义)都会被路由到City模块的city操作,而后面的第二个参数会被解析成 $_GET[‘name’]
接下来,我们就可以在浏览器里面输入
http:///index.php/City/beijing/
http:///index.php/City/shanghai/
http:///index.php/City/shenzhen/
会看到依次输出的结果是:
当前城市:beijing
当前城市:shanghai
当前城市:shenzhen

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

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

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

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

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

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

没有评论:

关注者

博客归档