ThinkPHP3.2基础教程(34)--URL操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThinkPHP3.2基础教程(34)--URL操作相关的知识,希望对你有一定的参考价值。

URL大小写

  系统默认的规范是根据URL里面的模块名、控制器名来定位到具体的控制器类的,从而执行控制器类的操作方法。

  如果是Windows环境,无论大小写如何都能定位到,如果在Linux环境下面,一旦大小写不一致,就会发生URL里面使用小写模块名不能找到模块类的情况。但是系统本身提供了一个不区分URL大小写的解决方案,可以通过配置简单实现。

  只要在项目配置中,增加:

‘URL_CASE_INSENSITIVE‘ =>true

  配置好后,即使是在Linux环境下面,也可以实现URL访问不再区分大小写了。

  这里需要注意一个地方,一旦开启了不区分URL大小写后,如果我们要访问类似UserTypeController的控制器,那么正确的URL访问应该是:

// 正确的访问地址
http://serverName/index.php/home/user_type/index
// 错误的访问地址(linux环境下)
http://serverName/index.php/home/usertype/index

  如果设置

‘URL_CASE_INSENSITIVE‘ =>false

  URL就又变成: http://serverName/index.php/Home/UserType/add

  注意:URL不区分大小写并不会改变系统的命名规范,并且只有按照系统的命名规范后才能正确的实现URL不区分大小写。

伪静态

  URL伪静态通常是为了满足更好的SEO效果,ThinkPHP支持伪静态URL设置,可以通过设置URL_html_SUFFIX参数随意在URL的最后增加你想要的静态后缀,而不会影响当前操作的正常执行。例如,我们设置

    ‘URL_HTML_SUFFIX‘=>‘shtml‘

  我们就可以把下面的URL http://serverName/Home/Blog/read/id/1 变成 http://serverName/Home/Blog/read/id/1.shtml,后者更具有静态页面的URL特征,但是具有和前面的URL相同的执行效果,并且不会影响原来参数的使用。

  默认情况下,伪静态的设置为html,如果我们设置伪静态后缀为空,

‘URL_HTML_SUFFIX‘=>‘‘

  则可以支持所有的静态后缀,并且会记录当前的伪静态后缀到常量 __EXT__ ,但不会影响正常的页面访问。

  如果希望支持多个伪静态后缀,可以直接设置如下:

// 多个伪静态后缀设置 用|分割
‘URL_HTML_SUFFIX‘ => ‘html|shtml|xml‘ 

  可以设置禁止访问的URL后缀,例如:

‘URL_DENY_SUFFIX‘ => ‘pdf|ico|png|gif|jpg‘, // URL禁止访问的后缀设置

  注意:URL_DENY_SUFFIX的优先级比URL_HTML_SUFFIX要高。

URL生成

  为了配合所使用的URL模式,我们需要能够动态的根据当前的URL设置生成对应的URL地址,为此,ThinkPHP内置提供了U方法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响。

  定义规则

    U方法的定义规则如下(方括号内参数根据实际应用决定):

    U(‘地址表达式‘,[‘参数‘],[‘伪静态后缀‘],[‘显示域名‘])

    地址表达式

      地址表达式的格式定义如下:

[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...

      如果不定义模块的话 就表示当前模块名称,下面是一些简单的例子:

U(‘User/add‘) // 生成User控制器的add操作的URL地址
U(‘Blog/read?id=1‘) // 生成Blog控制器的read操作 并且id为1的URL地址
U(‘Admin/User/select‘) // 生成Admin模块的User控制器的select操作的URL地址

    参数

      U方法的第二个参数支持数组和字符串两种定义方式,如果只是字符串方式的参数可以在第一个参数中定义,例如:

U(‘Blog/cate‘,array(‘cate_id‘=>1,‘status‘=>1))
U(‘Blog/cate‘,‘cate_id=1&status=1‘)
U(‘Blog/cate?cate_id=1&status=1‘)

      三种方式是等效的,都是生成Blog控制器的cate操作 并且cate_id为1 status为1的URL地址。但是不允许使用下面的定义方式来传参数。

U(‘Blog/cate/cate_id/1/status/1‘);

  自动识别

    根据项目的不同URL设置,同样的U方法调用可以智能地对应产生不同的URL地址效果,例如针对:

U(‘Blog/read?id=1‘);
http://serverName/index.php?m=Blog&a=read&id=1 //URL设置为普通模式
http://serverName/index.php/Home/Blog/read/id/1 //URL设置为PATHINFO模式
http://serverName/Home/Blog/read/id/1 //URL设置为REWRITE模式
http://serverName/Home/Blog/read/id/1.html //URL设置了REWRITE模式,并且设置了伪静态后缀为.html

    如果开启了URL_CASE_INSENSITIVE,则会统一生成小写的URL地址。

  生成路由地址

    U方法还可以支持路由,如果我们定义了一个路由规则为:

 ‘news/:id\d‘=>‘News/read‘

    那么可以使用

U(‘/news/1‘);

    最终生成的URL地址是:

http://serverName/index.php/Home/news/1

    注意:如果你是在模板文件中直接使用U方法的话,需要采用 {:U(‘参数1‘, ‘参数2‘…)} 的方式。

  域名支持

    如果你的应用涉及到多个子域名的操作地址,那么也可以在U方法里面指定需要生成地址的域名,例如:

U(‘Blog/[email protected]‘,‘id=1‘);

    @后面传入需要指定的域名即可。系统会自动判断当前是否SSL协议,生成https://。

    此外,U方法的第4个参数如果设置为true,表示自动识别当前的域名,并且会自动根据子域名部署设置APP_SUB_DOMAIN_DEPLOY和APP_SUB_DOMAIN_RULES自动匹配生成当前地址的子域名。

  锚点支持

    U函数可以直接生成URL地址中的锚点,例如:

U(‘Blog/read#comment?id=1‘);

    生成的URL地址可能是:

http://serverName/index.php/Home/Blog/read/id/1#comment

 

    

以上是关于ThinkPHP3.2基础教程(34)--URL操作的主要内容,如果未能解决你的问题,请参考以下文章

ThinkPHP3.2基础教程(37)--控制器-Action参数绑定

ThinkPHP3.2基础教程(20)--模型-CURD操作-数据写入

ThinkPHP3.2基础教程--模型-字段定义

ThinkPHP3.2基础教程(19)--模型-CURD操作-数据创建

Thinkphp3.2.3url重写问题

ThinkPHP3.2基础教程(36)--控制器-前置和后置操作