ThinkPHP URL模式和URL重写
现在用的版本是TP3.1.3,这两天总是遇到NotFound的错误,解析路径错误,所以认真研究了一下手册,发现问题出在URL模式上面。
URL模式
一般是使用U方法来生成路径,U方法的定义规则如下(方括号内参数根据实际应用决定):
U('[分组/模块/操作]?参数' [,'参数','伪静态后缀','是否跳转','显示域名'])
如果不定义项目和模块的话 就表示当前项目和模块名称,下面是一些简单的例子:
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')
所以关键就在于视图页面使用的U方法是用哪种方式来传递参数的。不同的传参方法,对应不同的URL_MODEL。相当于使用不同的传参方法就要设置相对应的解析方式。
而URL_MODEL设置在手册里写的很清楚:
一、普通模式:设置URL_MODEL 为0
采用传统的URL参数模式
http://serverName/appName/?m=module&a=action&id=1
二、PATHINFO模式(默认模式):设置URL_MODEL 为1
默认情况使用PATHINFO模式,ThinkPHP内置强大的PATHINFO支持,提供灵活和友好URL支持。PATHINFO模式自动识别模块和操作,例如
http://serverName/appName/module/action/id/1/
或者
http://serverName/appName/module,action,id,1/
在不考虑路由的情况下,第一个参数会被解析成模块名称(如果启用了分组的话,则依次往后递推),第二个参数会被解析成操作,后面的参数是显式传递的,而且必须成对出现,例如:
http://serverName/appName/module/action/year/2008/month/09/day/21/
其中参数之间的分割符号由URL_PATHINFO_DEPR参数设置,默认为”/”,例如我们设置URL_PATHINFO_DEPR为“-”的话,就可以使用下面的URL访问
http://serverName/appName/module-action-id-1/
注意不要使用”:” 和”&”符号进行分割,该符号有特殊用途。
略加修改,就可以展示出富有诗意的URL,呵呵~
如果想要简化URL的形式可以通过路由功能(后面会有描述)以及空模块和空操作。
在PATH_INFO模式下面,会把相关参数转换成GET变量,以及并入REQUEST变量,因此不妨碍URL里面的GET和REQUEST变量获取。
三、REWRITE模式: 设置URL_MODEL 为2
该URL模式和PATHINFO模式功能一样,除了可以不需要在URL里面写入口文件,和可以定义.htaccess 文件外。在开启了Apache的URL_REWRITE模块后,就可以启用REWRITE模式了,具体参考下面的URL重写部分。
四、兼容模式: 设置URL_MODEL 为3
兼容模式是普通模式和PATHINFO模式的结合,并且可以让应用在需要的时候直接切换到PATHINFO模式而不需要更改模板和程序,还可以和URL_WRITE模式整合。兼容模式URL可以支持任何的运行环境。
兼容模式的效果是:
http://serverName/appName/?s=/module/action/id/1/
并且也可以支持参数分割符号的定义,例如在URL_PATHINFO_DEPR为~的情况下,下面的URL有效:
http://serverName/appName/?s=module~action~id~1
其
实是利用了VAR_PATHINFO参数,用普通模式的实现模拟了PATHINFO的模式。但是兼容模式并不需要自己传s变量,而是由系统自动完成URL
部分。正是由于这个特性,兼容模式可以和PATHINFO模式之间直接切换,而不需更改模板文件里面的URL地址连接。
某些服务器环境不能良好的支持PATHINFO,但是在大多数环境下面ThinkPHP可以进行兼容判断,如果你的服务器环境或者空间仍然无法识别PAHTINFO的话,或者需要自己增加识别方法或者可以选择普通模式或者兼容模式URL运行。
URL重写
这里第三种模式在网站发布的时候时常会用到,为了使URL看起来更加清爽,所以需要开启URL_MODEL=2,而这个模式和模式1没有太大区别,但是需要对Apache服务器进行相应的配置。下面是官方手册上的介绍:
通常的URL里面含有index.php,为了达到更好的SEO效果可能需要去掉URL里面的index.php ,通过URL重写的方式可以达到这种效果,通常需要服务器开启URL_REWRITE模块才能支持。
下面是Apache的配置过程,可以参考下:
//--------------------------------------
1、httpd.conf配置文件中加载了mod_rewrite.so模块
2、AllowOverride None 将None改为 All 注意:需要将所有出现的 "AllowOverride None" 中的 "None" 都改为 "All" ,不然是不行的
3、确保URL_MODEL设置为2
4、把下面的内容保存为.htaccess文件放到入口文件的同级目录下
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
---------------------------------------//
重启Apache之后,原来的
http://serverName/index.php/Blog/read/id/1
就可以通过访问
http://serverName/Blog/read/id/1
简化了URL地址。
在一般情况下,网站开发的时候可以只使用URL_MODEL=1这个模式,如果要使用URL路由,则应该配置URL_MODEL=2.这部分以后遇到再做研究。
ThinkPHP URL模式和URL重写的更多相关文章
- thinkphp3.2笔记(2)调试模式,配置项C,创建模块, 四种URL模式,URL生成,跳转
一.调试模式 TP的调试模式其实就控制了TP关于配置信息以及函数的缓存功能 如果开启了调试模式,每次访问项目,Tp都会去加载最新的配置以及函数信息. 如果关闭了调试模式,当tp第一次访问时会降配置以及 ...
- thinkphp url模式
入口文件是应用的单一入口,对应用的所有请求都定向到应用入口文件,系统会从URL参数中解析当前请求的模块.控制器和操作: http://serverName/index.php/模块/控制器/操作 这是 ...
- opensns的URL模式
URL模式 如果我们直接访问入口文件的话,由于URL中没有模块.控制器和操作,因此系统会访问默认模块(Home)下面的默认控制器(Index)的默认操作(index),因此下面的访问是等效的: htt ...
- Django url配置 正则表达式详解 分组命名匹配 命名URL 别名 和URL反向解析 命名空间模式
Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11版本 ...
- 【三十一】thinkphp之安装、配置、模块化及URL模式
一:安装与配置 1.获取ThinkPHP 下载地址:http://www.thinkphp.cn/down.html 2.入口文件 ThinkPHP采用单一入口模式对项目进行部署和访问,所以我们需要通 ...
- ThinkPHP的URL模式
ThinkPHP的URL模式有四种,默认是PATHINFO模式,其他三种分别为:普通模式.REWRITE和兼容模式. 一.PATHINFO模式 浏览器输入格式为: http://localhost/d ...
- (转)nginx下基于ThinkPHP框架的网站url重写
nginx下基于ThinkPHP框架的网站url重写nginx下的基于thinkphp的应用的url重写,需了解thinkphp的各种url格式参数的处理逻辑以及nginx重写的原理.简单点说,无论哪 ...
- ThinkPHP 3.2.3(三)架构之URL模式
一.标准URL格式 http://serverName/index.php/模块/控制器/操作 二.URL大小写 在/ThinkPHP/Conf/convention.php文件里有URL大小写的 ...
- ThinkPHP的四种URL模式 URL_MODEL
ThinkPHP支持四种URL模式,可以通过设置URL_MODEL参数来定义,包括普通模式.PATHINFO.REWRITE和兼容模式. 普通模式 设置URL_MODEL 为0 采用传统的URL参数模 ...
随机推荐
- Linux程序设计(二)shell程序设计
1. 管道和重定向 文件描述符0:一个程序的标准输入 文件描述符1:标准输出 文件描述符2:标准错误输出 >操作符:把标准输出重定向到一个文件. >>操作符:将输出内容附加到一个文件 ...
- angular2自学笔记---官网项目(一)
1.单向数据绑定的'插值表达式' angular中最典型的数据显示方式:把HTML模板(template)的控件绑定到angular组件的属性(component相当于一个构造函数,下面例子中的这个构 ...
- WebBindingInitializer学习
今天在看开源代码的时候遇到了这个接口,于是查阅了下相关的资料 Spring web mvc学习笔记 http://www.cnblogs.com/crazy-fox/archive/2012/02/1 ...
- 【C#】与C及OC的不同点
事实上熟悉这些语言的朋友们深知,这几个语言全然没有可比性. 因为工作须要,近期须要重温C#语言,难免会受到C和OC的基础知识影响. 此篇是本人的一个学习笔记.仅此献给有C/OC基础,须要继续学习C# ...
- 【HDU】5247-找连续数(直接暴力)
ORZ,这道题想复杂了,原来直接暴力就能够了复杂度为 n * n * logn #include<cstdio> #include<set> #include<algor ...
- Qt 国际化之二:多国语界面动态切换的实现
第一步在你的pro里面加入 TRANSLATIONS = myexec_zh.ts (根据对应的ts文件修改)第二步用lupdate 操作pro 将要翻译的提取到ts文件 命令是 lupdate my ...
- hadoop错误FATAL org.apache.hadoop.hdfs.server.namenode.NameNode Exception in namenode join java.io.IOException There appears to be a gap in the edit log
错误: FATAL org.apache.hadoop.hdfs.server.namenode.NameNode Exception in namenode join java.io.IOExcep ...
- Java Interface是存放常量的最好地方吗?(转)
虽然Inteface中默认常量就是static final 的.因此很多人就认为其实存放常量的最佳地方,effective java中就提过,不建议使用常量接口.其有一个原因就是:代码编译问题 好,我 ...
- Caused by: java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC
Caused by: java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC 缺少com/sun/tools/inte ...
- Eclipse项目 迁移到 Intellj IDEA
自从用了Intellj IDEA,很多项目都想迁移到Intellj上面去开发 鉴于我们的大部分项目都是基于Maven构建的,所以就可以利用maven的命令来做这个事情. 1.选择一个ecli ...