ThinkPHP 的 URL 操作。主要涉及到 URL 路径大小写、伪静态、生成以及模版中的 U()方法。

一、URL大小写

系统默认的规范是根据 URL 里面的模块名、控制器名来定位到具体的控制器类。比如:

 http://localhost/demo39/index.php/Home/User/index/id/5

PS:在 windows 平台,URL 中的大小写会自动忽略,但作为开发人员,保持大小写区
分是一个良好的习惯。而 Linux 平台,如果大小写错误,会导致无法定位到指定的模块、
控制器。

在 WeiBo/Common/Conf/config.php 中进行配置:

 //URL可以不区分大小写
'URL_CASE_INSENSITIVE' =>true

PS:如果开启了不区分大小写,那么对于  UserTypeController.class.php  这样的控
制器就需要如下访问方式:

 http://localhost/demo39/index.php/home/user_type/index/

如果区分大小写,则是这样:

 http://localhost/demo39/index.php/Home/UserType/index/

二、URL伪静态

URL 伪静态同城是为了满足更好的 SEO 效果,ThinkPHP 支持伪静态设置。

默认情况下,伪静态后缀为.html

 http://localhost/demo39/User/index.html
http://localhost/demo39/User/index/id/5.html

设置伪静态后缀,默认为html

 'URL_HTML_SUFFIX'=>'shtml',
 http://localhost/demo39/User/index.shtml

如果设置为空,那么就任意后缀

 'URL_HTML_SUFFIX'=>'',

如果设置为空,可以用__EXT__常量获取当前使用的后缀

在 View/User/index.html 中:

 {$Think.const.__EXT__}

设置可以伪静态的后缀

 'URL_HTML_SUFFIX'=>'html|shtml|xml',

禁止访问的后缀

 'URL_DENY_SUFFIX' => 'html|pdf|ico|png|gif|jpg',

这时如果使用禁止访问的后缀来访问页面的话,页面无任何显示,在页面中查看源代码也无任何显示。

三、URL的生成

为了配合所使用的 URL 模式,我们需要能够动态的根据当前的 URL 设置生成对应的 URL
地址。为此,ThinkPHP 内置了一个 U()方法,用于 URL 的动态生成。

定义格式:U('地址表达式',['参数'],['伪静态后缀'],['显示域名'])

默认得到当前URL,在 Home/controller/UserController.class.php 中插入以下代码:

 echo U();             ///demo39/User/index.html

demo39 前面的三条 /// ,两条是注释符,一条是目录符。

地址表达式的格式如下:

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

控制器+方法

 echo U('User/add');

输出为: /demo39/index.php/User/add.html ,需要注意的是 echo U('User/add'); 这里面的 User/add 跟它的文件名 UserController.class.php 中的 User

没有任何关系,跟 class UserController extends Controller  也没有任何关系。

全部代码:

 class UserController extends Controller {
public function index() {
echo u('Member/add');
$this->display();
}
}

输出为: /demo39/index.php/Member/add.html 此时浏览器上的地址为: http://localhost/demo39/Home/User/index

控制器+方法+?参数1=值1

 echo U('User/add?id=5');

输出为: /demo39/index.php/User/add/id/5.html

模块+控制器+方法+?参数1=值1

 echo U('Admin/User/add?id=5');

输出为: /demo39/index.php/Admin/User/add/id/5.html

U()方法第二个参数可以分离参数和值的操作,支持字符串和数组的写法。

使用数组参数1=值1,参数2=值2

 echo U('User/add', array('id'=>5,'type'=>'a'));

输出为:  /demo39/index.php/User/add/id/5/type/a.html

使用字符串参数1=值1,参数2=值2

 echo U('User/add','id=5&type=a');

输出为: /demo39/index.php/User/add/id/5/type/a.html

PS:不允许使用 PATHINFO 模式的路径来编写路径,比如:

 echo U('User/add/id/1/type/a');

他会输出: /demo39/index.php/1/type/a.html ,但是这个生成的URL是错误的。

U()方法第三个参数可以指定伪静态后缀,比如:

 //指定伪静态后缀
echo U('User/add', array('id'=>5),'xml');

输出为: /demo39/index.php/User/add/id/5.xml

在 WeiBo/Common/Conf/config.php 设置 'URL_MODEL'=>0 ,普通模式后

 echo U('User/add', array('id'=>5),'xml');

URL生成将如下: /demo39/index.php?m=&c=User&a=add&id=5

设置 'URL_MODEL'=>1 ,PATHINFO模式后URL生成将如下:

输出为: /demo39/index.php/User/add/id/5.html

设置 'URL_MODEL'=>2 ,REWRITE模式后URL生成将如下:

输出为: /demo39/User/add/id/5.html

注意这时连 index.php 都省掉了。

设置 'URL_MODEL'=>3 ,兼容模式后URL生成将如下:

输出为: /demo39/index.php?s=/User/add/id/5.html

PS:在这里我们使用 REWRITE 重写模式,它是 PATHINFO 的升级版,地址最短。

我们也可以生成路由地址,使用路由的规则生成的地址:

在下面的数组里面写。

'URL_ROUTE_RULES' => array(
),

(其实不在里面写的效果测试了是一样的,但还是服从规范吧)

在 WeiBo/Common/Conf/config.php 中:

 //规则路由
'u/:id\d'=>'User/index',

在 Home/controller/UserController.class.php 中:

 //生成规则路由地址
echo U('/u/5');

输出为: /demo39/index.php/u/5.html

生成正则路由地址

 '/^u_(\d+)$/'=>'User/index?id=:1',

在  Home/controller/UserController.class.php  中:

 echo u('/u_5');

输出为: /demo39/index.php/u_5.html

 echo u('/u/5');

也会输出: /demo39/index.php/u/5.html

域名支持:

 echo U('User/add@www.ycuk.com?id=5');

则输出为: http://www.ycuk.com/demo39/index.php/User/add/id/5.html ,这时在 WeiBo/Common/Conf/config.php 不用其他配置。

add后面有@符号,不要忘了写

锚点支持

 echo U('User/add#comment?id=5');

输出为: /demo39/index.php/User/add/id/5.html#comment

四、模版中的U

我们之前使用 U()方法,都是在控制器里实现的。但实际用途中,大量的超链接是在模
版中设置的,而在控制器把 U()当变量传递过去,有点过于繁杂。所以,我们可以在模版使

用使用 U()方法。

 在模版中使用U()方法
{:U('User/add', array('id'=>5))}

这时 Home/controller/UserController.class.php 中的代码为:

 <?php

 namespace Home\Controller;
use Think\Controller; class UserController extends Controller {
public function index() {
$this->display();
}
}

如果没有 $this->display(); ,则 View/User/index.html 里没有任何显示。

URL操作的更多相关文章

  1. js原生的url操作函数,及使用方法。(附:下边还有jquery对url里的中文解码函数)

    js原生的url操作函数,完善的. /*****************************/ /* 动态修改url */ /*****************************/ var ...

  2. MT写的对URL操作的两个方法

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. url操作一网打尽(一)

    1:url实际应用简介 近期研究发现通过url传递参数很普遍的(淘宝也是这样做的), 通过修改url来传递参数,比如通过关键字搜索某件商品的时候,链接便追加了相应参数.在请求接口的时候直接对url进行 ...

  4. jstl--->Core 核心标签库->URL操作

    jstl--->Core 核心标签库->URL操作 -->import.param.URL.redirect <c:import>将静态或动态文件包含至本身jsp页面 而 ...

  5. [原创]java WEB学习笔记43:jstl 介绍,core库详解:表达式操作,流程控制,迭代操作,url操作

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. jQuery 工具类函数-URL操作函数

    调用名为$. param的工具函数,能使对象或数组按照key/value格式进行序列化编码,该编码后的值常用于向服务端发送URL请求,调用格式为: $. param (obj); 参数obj表示需要进 ...

  7. php 对url 操作类:url拼接、get获取页面、post获取页面(带传参)

    /* * @brief url封装类,将常用的url请求操作封装在一起 * */ class URL{ private $error; public function __construct(){ $ ...

  8. PHP 路径或URL操作

    echo 'documentroot:'.$_SERVER['DOCUMENT_ROOT'].'<br>'; //根目录,在apache的配置文件里定义:httpd.conf 比如:Doc ...

  9. 打开URL操作

    /* * 打开 url 的两种方法 */ public class OpenUrl { public static void main(String[] args) { String url = &q ...

随机推荐

  1. 【.Net 】Json和Xml解析

    引言    Json和Xml是现在跨平台传输数据的主流格式,关于它们的解析,网上资料很多,我稍作整理,写成一个小demo,方便日后使用. JSON解析     能进行json解析的类库有很多,例如Ja ...

  2. Github-jcjohnson/torch-rnn代码详解

    Github-jcjohnson/torch-rnn代码详解 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-3- ...

  3. 剑指offer--21.链表中倒数第k个结点

    定义两个指针,当一个指针指到第K个结点时,第二个指针开始向后移动 -------------- 时间限制:1秒 空间限制:32768K 热度指数:602826 本题知识点: 链表 题目描述 输入一个链 ...

  4. Git和Github使用说明

    1. 安装 官网地址:https://git-scm.com/downloads 我这里使用的是git version 2.19.1.windows.1,全程傻瓜式安装,点下一步即可,可以把命令模式和 ...

  5. 20179203 《Linux内核原理与分析》第十二周作业

    Return-to-libc 攻击实验 一.实验描述 缓冲区溢出的常用攻击方法是用 shellcode 的地址来覆盖漏洞程序的返回地址,使得漏洞程序去执行存放在栈中 shellcode.为了阻止这种类 ...

  6. 虚拟环境中的django及相关包安装

    1.先进入虚拟环境 pyenv activate virtualenvname. 2.安装django软件包 安装命令: pip install django==1.7 查看安装结果: python ...

  7. RDD之一:总体介绍

    摘要 本文提出了分布式内存抽象的概念——弹性分布式数据集(RDD,Resilient Distributed Datasets),它具备像MapReduce等数据流模型的容错特性,并且允许开发人员在大 ...

  8. Oracle Flushback 学习测试

    Oracle Flushback 学习测试:三思笔记 Flashback恢复 从9i开始,利用oracle查询的多版本一致的特点,实现从回滚段中读取一定时间内在表中操作的数据,被称为 flashbac ...

  9. 2 ignite关键特性

    数据注入和流计算: Ignite流式计算允许以可扩展和容错的方式处理连续不中断的数据流.在一个中等规模的集群中,数据注入Ignite的比例会很高,很容易达到每秒百万级的规模. Ignite可以与主要的 ...

  10. [置顶] linux getline()函数

    getline()函数是什么?百度百科这样解释:      getline不是C库函数,而是C++库函数.它会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束.1) ...