URL操作
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操作的更多相关文章
- js原生的url操作函数,及使用方法。(附:下边还有jquery对url里的中文解码函数)
js原生的url操作函数,完善的. /*****************************/ /* 动态修改url */ /*****************************/ var ...
- MT写的对URL操作的两个方法
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- url操作一网打尽(一)
1:url实际应用简介 近期研究发现通过url传递参数很普遍的(淘宝也是这样做的), 通过修改url来传递参数,比如通过关键字搜索某件商品的时候,链接便追加了相应参数.在请求接口的时候直接对url进行 ...
- jstl--->Core 核心标签库->URL操作
jstl--->Core 核心标签库->URL操作 -->import.param.URL.redirect <c:import>将静态或动态文件包含至本身jsp页面 而 ...
- [原创]java WEB学习笔记43:jstl 介绍,core库详解:表达式操作,流程控制,迭代操作,url操作
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- jQuery 工具类函数-URL操作函数
调用名为$. param的工具函数,能使对象或数组按照key/value格式进行序列化编码,该编码后的值常用于向服务端发送URL请求,调用格式为: $. param (obj); 参数obj表示需要进 ...
- php 对url 操作类:url拼接、get获取页面、post获取页面(带传参)
/* * @brief url封装类,将常用的url请求操作封装在一起 * */ class URL{ private $error; public function __construct(){ $ ...
- PHP 路径或URL操作
echo 'documentroot:'.$_SERVER['DOCUMENT_ROOT'].'<br>'; //根目录,在apache的配置文件里定义:httpd.conf 比如:Doc ...
- 打开URL操作
/* * 打开 url 的两种方法 */ public class OpenUrl { public static void main(String[] args) { String url = &q ...
随机推荐
- 【译】:lxml.etree官方文档
本文翻译自:http://lxml.de/tutorial.html, 作者:Stefan Behnel 这是一个关于使用lxml.etree进行XML处理的教程.它简要介绍了ElementTree ...
- Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2) E
题意:减前面的数,加后面的数,保证最后不剩下数,加减次数要相同: 题解:emmmmm,看出是个贪心,先对价值排序,相同就对下标排序,规律是每次找第一个,然后从后往前找没有使用过的下表比他大的第一个,相 ...
- WCF最简单的一次通信(有部分參考,多爲原創)
不廢話,直接上乾貨 1.先创建一个wcf服务库,是服务类库,远程的lib 2.全部按照默认设置,不修改.然后点发布,会出现一个wcf测试客户端,可以看有没有发布成功. 3.msdn的wcf教程还要求输 ...
- IDEA 上传更新的代码到码云上
1.Commit Changes 2. .
- oralce 索引(1)
本文来自网上整理 来自以下博客内容 http://www.360doc.com/content/13/0712/11/13136648_299364992.shtml; http://www.cnbl ...
- linux monitor and maintanence
@cacti 1.install epel extends source 2.install lamp use yum method yum install -y httpd php php-mysq ...
- hdu-3790-最短路径问题(Dijkstra)
题目链接 /* Name:hdu-3790-最短路径问题 Copyright: Author: Date: 2018/4/16 19:16:25 Description: dijkstra 模板题 * ...
- 细说移动前端Android联调
为什么要联调 A:正在疯狂coding的时候,产品MM过来,焦急的说两周前的一个页面在手机上显示略微错位,但小本上显示正常! B:本着爱折腾的原则,作为大前端,在移动互联网时代的基本技能. 联调的方式 ...
- flash、js 函数 互相调用
js调用flex函数 flex 利用ExternalInterface.addCallback(“注册的方法名”,As中的函数名)进行注册 js中,用document.getElementById(“ ...
- CH5E01[NOIP2010] 乌龟棋[暴力]
众所周知,由于这个人太菜了,所以她又来切上古水题了. 显然最多$40^4$种状态,暴力跑出可以拼出多少种状态,然后按序号从小到大对应的状态瞎转移即可. 我知道我想繁了,但是不想改了,因为思路一出来,没 ...