请选择 进入手机版 | 继续访问电脑版

SpeedPHP框架

 找回密码
 注册成为新用户

QQ登录

只需一步,快速开始

查看: 14002|回复: 0

[访问交互] 自定义伪静态URL设置

[复制链接]
发表于 2012-8-4 14:07:39 | 显示全部楼层 |阅读模式
SpeedPHP框架的spUrlRewrite伪静态功能可以做到非常多的URL地址的效果,而且很简单配置一下即可。下面我们来看看一些配置的例子:

以下假设域名为speedphp.com
group/index 的意思是 控制器 group,动作index
简单设置
  1. 'spUrlRewrite' => array(
  2.         'suffix' => '.html',
  3.         'sep' => '-',
  4.         'map' => array(),
  5.         'args' => array(),
  6. ),
复制代码

那么

speedphp.com/index.php?c=group&a=index

speedphp.com/index.php?c=main&a=article

变成

speedphp.com/group-index.html

speedphp.com/main-article.html



带参数

speedphp.com/index.php?c=group&a=index&uid=100

speedphp.com/index.php?c=main&a=article&by=time&tid=213

变成

speedphp.com/group-index-uid-100.html

speedphp.com/main-article-by-time-tid-213.html

这个URL太长了?没关系,下面我们还会缩短它,很快。



分隔符'sep'和后缀'suffix'的设置

通过配置'suffix' 和 'sep' 能够构造出更多有趣的URL地址。

  • 'suffix' 可以是任意值,如 '.do' 、'.asp' 或者为空 等等
  • 'sep' 可以是“-_/”任意一个,如

speedphp.com/group/index.asp

speedphp.com/group-index.do

speedphp.com/group_index.asp

提示:在使用'sep'为‘/’的时候,请注意相对路径此时不能起作用,务必要使用绝对路径。所以,在一定程度来说,使用“-”和“_”作为'sep'是更好的选择——不会引起路径问题。



'map'映射和'args'参数的设置

'map'映射是将一个映射名称对应上某个控制器/动作,使得URL上直接访问该名称就可以执行这个控制器/动作,相等于缩短了URL中“控制器/动作名称”的部分。

  1. 'spUrlRewrite' => array(
  2.         'suffix' => '.html',
  3.         'sep' => '-',
  4.         'map' => array(
  5.                 'groups' => 'group@index', // 映射groups对应group/index
  6.                 'cms' => 'main@article', // 映射cms对应main/article
  7.         ),
  8. ),
复制代码

speedphp.com/groups.html  // 执行  group/index

speedphp.com/cms.html // 执行 main/article

speedphp.com/group-guestbook.html // 这是未设置map的 group/guestbook

speedphp.com/news-text.html // 这是未设置map的 news/text

请注意:映射名不能是控制器名称。否则整个控制器的访问都会被映射接管。如group/index的映射名可以设置成groups,但不能是group,否则整个group控制器的执行都会转向到group/index。

'args'参数指代一个映射中的各个参数名称,名称按顺序匹配。和'map'映射缩短“控制器/动作名称”的部分同理,'args'参数缩短了URL中“提交参数名称”的部分(是缩短参数名称,参数值可不能缩短)。

speedphp.com/index.php?c=group&a=index&uid=100

speedphp.com/index.php?c=main&a=article&by=time&tid=213

  1. 'spUrlRewrite' => array(
  2.         'suffix' => '.html',
  3.         'sep' => '-',
  4.         'map' => array(
  5.                 'groups' => 'group@index',
  6.                 'cms' => 'main@article',
  7.                 'other' => 'other@index',
  8.         ),
  9.         'args' => array(
  10.                 'groups' => array('uid'),
  11.                 'cms' => array('by' , 'tid'),
  12.         ),
  13. ),
复制代码

最终效果:

speedphp.com/groups-100.html  // 执行  group/index,

参数
$this->spArgs('uid') = 100
speedphp.com/cms-time-213.html  // 执行  main/article,

参数
$this->spArgs('by') = time
$this->spArgs('tid') = 213

如果在配置的args中没有对应的参数名称,将按照“名-值”的方式排列接收。

speedphp.com/other-mytype-img-time-today.html // 执行other/index

参数
$this->spArgs('mytype') = img
$this->spArgs('time') = today
speedphp.com/groups-100-by-group.html // 执行 group/index

参数
$this->spArgs('tid') = 100
$this->spArgs('by') = group

另外,为了兼容部分Javascript等不能直接构造URL地址的情况,spUrlRewrite还支持原始的?&=的参数传递:

speedphp.com/groups-100-by-group.html?uid=200&view=getup // 执行 group/index


参数

$this->spArgs('tid') = 100

$this->spArgs('by') = group

$this->spArgs('uid') = 200

$this->spArgs('view') = getup


在开发中可以经常通过dump($this->spArgs());来查看全部提交的参数。

特例@形式

在'map'映射和'args'参数中,我们还可以设置映射名称“@”的映射,它的作用是:当无法找到映射和控制器的时候,会默认执行“@”映射对应的控制器/动作,这样就可以实现一些类似“泛域名”形式的URL了。

普通的映射:

speedphp.com/groups.html

speedphp.com/cms.html

除了这些系统控制器之外的名字,全部用于用户自己的域名:

speedphp.com/jake

speedphp.com/myblogger

  1. 'spUrlRewrite' => array(
  2.         'suffix' => '.html',
  3.         'sep' => '-',
  4.         'map' => array(
  5.                 'groups' => 'group@index',
  6.                 'cms' => 'main@index',
  7.                 '@' => 'user@index',
  8.         ),
  9.         'args' => array(
  10.                 'groups' => array('tid'),
  11.                 '@' => array('username'),
  12.         ),
  13. ),
复制代码

speedphp.com/标识.html,当“标识”的符合以下两个条件的时候,将执行 user/index 参数$this->spArgs('username') = 标识。

  • map中没有键是等于“标识”的。
  • 没有一个控制器名称等于“标识”的,如果“标识”的名称是控制器,那么会优先执行控制器。

这种@映射实现的对应地址,其实和前面的普通映射+参数是几乎相同的作用,唯一的不同,是@映射不需要加入对应的控制器名称或映射名称,相当于映射值为空。如:

普通映射+参数:

speedphp.com/member-user1.html

speedphp.com/member-user2.html

。。。

@映射:

speedphp.com/user1.html

speedphp.com/user2.html

。。。


您需要登录后才可以回帖 登录 | 注册成为新用户

本版积分规则

手机浏览|简版|中文PHP框架|开源协议|SpeedPHP.com ( 粤ICP备08008671号

GMT+8, 2020-4-9 20:57

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表