#1 jake

urlrewrite也就是URL重写,是在服务器重写模块的支持下,将用户的请求都转送到某PHP文件上,然后再通过该PHP来进行调度执行对应的程序。

urlrewrite的最常规的应用是“伪静态”,即是通过重写的特性来将原本

http://www.example.com/index.php?c=main&a=mypage

这样的并不是很美观同时对搜索引擎亦不友好的URL地址,变成类似于

http://www.example.com/mypage.html

比较美观并且有利于SEO的URL的地址。

在SpeedPHP框架的2.5版本之后(版本>=2.5),已经加入了对urlrewrite伪静态的扩展类,让开发者可以方便地进行urlrewrite的设置和使用。


本文例子下载:rewrite25[1].rar

下面来介绍一下,spUrlRewrite扩展类的使用方法:

第一步,使用.htaccess

使用urlrewrite之前,首先要确定服务器能够支持.htaccess功能,Apache服务器默认支持,而IIS服务器则需要通过设置将请求转发到index.php文件上。

.htaccess脚本可以配置重写、缓存、错误提示等,非常有用,具体资料请自行搜索。
.htaccess的文件在windows下如果难以新建的话,可以直接从本例的压缩包中取出使用,使用记事本等功能均可对其编辑。
.htaccess放置在和index.php同级目录中即可。
.htaccess文件中的内容大约如下:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L]

这里.htaccess的作用主要就是将请求转发到index.php文件上。

第二步,应用程序配置

在应用程序配置中,需要加入以下的配置来启用urlrewrite扩展。

'launch' => array( // 加入挂靠点,以便开始使用Url_ReWrite的功能
        'router_prefilter' => array(
                        array('spUrlRewrite', 'setReWrite'),  // 对路由进行挂靠,处理转向地址
                ),
        'function_url' => array(
                        array("spUrlRewrite", "getReWrite"),  // 对spUrl进行挂靠,让spUrl可以进行Url_ReWrite地址的生成
            ),
),

第三步,根据需要,对urlrewrite进行配置

通过以上两步的设置后,应用程序已经支持了urlrewrite功能,所有通过spUrl生成的URL地址,都是伪静态的,同时,这些地址也可以正确的访问以及参数可以正常的接收。

这里继续说说spUrlRewrite扩展类的配置,在应用程序配置中加入以下配置:

'ext' => array(
                'spUrlRewrite' => array(
                'suffix' => '.html',
                'sep' => '/',
                'map' => array(
                        'search' => 'main@search',
                         '@' => 'main@no'        
                ),
                'args' => array(
                         'search' => array('q','page'),
                ),
        ),
),

suffix


  • 生成地址的结尾符,网址后缀,可自由设置,如果“.do”或“.myphp”,该参数可为空,默认是.html。

sep


  • 网址参数分隔符,建议是“-_/”之一

map


  • 网址映射,比如 'search' => 'main@search',将使得 http://www.example.com/search.html 转向控制器main/动作serach执行。
  • 特例 '@' => 'main@no' 如果映射是@,将使得符合以下条件的网址转向到 控制器main/动作no执行:1. 在map中无法找到其他映射,2. 网址第一个参数并非控制器名称。

args


  • 网址映射附加的隐藏参数,如果针对某个网址映射设置了隐藏参数,则在网址中仅会存在参数值,而参数名称被隐藏。
  • 比如 'search' => array('q','page'), 那么生成的网址将会是:http://www.example.com/search-thekey-2.html
  • 配合map映射'search' => 'main@search',这个网址将会执行 控制器main/动作serach,而参数q将等于thekey,参数page将等于2

以上就是spUrlReWrite扩展类的使用。

对比一下:
“真实HTML生成”的spHtml功能,是能够真实的生成静态HTML文件,
spUrlReWrite是“伪静态”,也就是该文件并不存在,仅是通过服务器特性来进行转移,是“假静态”。
在spHtml和spUrlReWrite同时使用的时候,将优先访问spHtml生成的真实文件。
然而,在实际开发中,比较推荐的是spHtml和spUrlReWrite是可以结合到一起来使用的,因为spHtml有着一定的使用限制,spHtml是务必要较少交互的内容才能进行真实静态化而提高程序速度;而spUrlReWrite会提供更美观的URL地址。

2012-08-04 13:56:00