PESCMS2.5引入了自定义路由,用户可以定义任何的路由进行简化沉长的URL。PESCMS的路由规则编写非常简单,且路由规则适用于restful请求。

创建路由文件

要实行自定义路由,我们需要先创建一个路由文件。在 /Config/Route 目录下创建一个任意命名的php文件。打开该文件,填写如下代码并保存:

  1. <?php
  2. return array(
  3. );

该路由文件目前没有任何路由规则,下面我们进行填写路由规则测试。

加载顺序:路由加载顺序是依据当前程序所用的系统默认文件排序方式进行加载,若您有多个路由文件,请自行调整文件的命名规则,避免路由规则优先度覆盖。

加载规则:PESCMS会自动读取/Config/Route目录下的所有文件并检查该文件是否为数组。

路由规则

路由规则以一维数组的形式编写,具体的形式为:路由名称 => 控制器 。一行一条规则。若路由规则需要带上显式参数(GET),那么在路由名称中带上显式参数名称,并用大括号括着该参数名称。文字表达可能难以理解,请参考如下代码:

  1. 'signup' => 'Home-Login-signup' //此处创建了一个注册用的路由规则。用户访问 http://域名/signup 等同于访问 http://域名/Home/Login/sigin
  2.  
  3. 'product/{id}' => 'Shop-Product-view' //此处创建了一个访问产品详情的路由规则,该路由并且绑定了一个id的显式参数。用户访问 http://域名/product/1 等同于访问 http://域名/Shop/Product/view/id/1

注:创建的路由规则适用于所有请求。如上面的signup规则,除了可以直接显式GET访问,还可以通过POST,PUT,DELETE使用该规则发起请求。发起上述请求,它会访问指定的控制器。具体请阅读控制器章节中,关于restful的说明。

路由优先度

在编写路由规则过程,我们会遇到一种比较特殊的情况。总有几个路由规则比较相似,但绑定的控制器却有不同。这个时候容易出现路由优先度覆盖的问题。优先度可以理解为执行顺序。先有如下路由规则:

  1. 'd/{type}' => 'Home-Index-test',
  2.  
  3. 'd/test' => 'Home-Index-other',
  4.  
  5. 'd/test1' => 'Home-Index-all',

上面的规则将出现一个优先度覆盖的问题。按照设想,我访问 http://域名/d/testhttp://域名/d/test1 都应该走到对应的控制器。而访问 http://域名/d/anything 或者 http://域名/d/other 应该走的到Home-Index-test 。实际上面三个路由规则都被指向到Home-Index-test控制器。

为什么会这样呢?因为当路由规则绑定了参数的情况下,该绑定参数处成为一个泛解析参数,程序执行到该处后,其后编写的路由规则只要起始值至参数绑定前部分的内容相同且规则长度相同的规则都被截断(此处文字表达比较拗口,参考上述代码比较直接)。

要解决优先度问题,可以进行如下调整:

1.将参数绑定的规则调整至最后执行的。

  1. 'd/test' => 'Home-Index-other',
  2.  
  3. 'd/test1' => 'Home-Index-all',
  4.  
  5. 'd/{type}' => 'Home-Index-test',

2.将参数绑定的规则长度调整 或者 将后面两个规则长度进行调整。

  1. 'd/index/{type}' => 'Home-Index-test',
  2.  
  3. 'd/test' => 'Home-Index-other',
  4.  
  5. 'd/test1' => 'Home-Index-all',
  1. 'd/{type}' => 'Home-Index-test',
  2.  
  3. 'd/index/test' => 'Home-Index-other',
  4.  
  5. 'd/index/test1' => 'Home-Index-all',
  • 发表于 2018-05-14

隐藏index.php

在上面演示的访问路由规则中,均对index.php隐藏了。若您的web软件没有开启重写规则,那么您访问的所有规则都需要加上 http://域名/index.php/您的路由规则

默认情况下,所有PESCMS程序的根目录都存放一个.htaccess文件。若您的程序没有该文件,请手动创建一个(非linux系统您可能需要到网上找生成器)。并填写如下代码:

  1. <IfModule mod_rewrite.c>
  2. RewriteEngine on
  3. RewriteCond %{REQUEST_FILENAME} !-d
  4. RewriteCond %{REQUEST_FILENAME} !-f
  5. RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
  6. </IfModule>

上述规则适用于Apache,若您的环境为Nginx,那么需要修改您服务器上的配置文件,在对应的配置文件任意位置引入如下代码:

  1. server{
  2. ...此处为您配置的虚拟主机信息...
  3.  
  4. location ~/ {
  5. if (!-e $request_filename){
  6. rewrite ^/(.*)$ /index.php?s=$1 last;
  7. }
  8. }
  9.  
  10. ...此处为您配置的虚拟主机信息...
  11. }

注:上述的修改请找熟悉软件配置的人修改,PESCMS官方不承担用户任何操作失误的责任。