什么是URL模式?
thinkhp是单入口框架,所有的请求都要通过入口文件,那么如何通过解析访问地址来调用对应的控制器中的方法呢?
我们常见的url可能有多种形式:
http://localhost/index.php?m=index&a=index
http://localhost/index.php/Index/user
显然第二种会比第一种美观一些。因此,thinkphp提供了四种URL模式,能够解析不同形式的url,从而调用相应的控制器中的方法
通过查看配置文件convention.php,我们可以知道thinkphp默认的url模式是PATHINFO模式
U方法
假设我们现在在Index控制器中添加了一个user方法,那么在当前url模式下,我们访问这个方法的url是什么样的呢?我们可以通过使用U方法来获取。
得到结果:
然后我们输入上图所示的地址,就能成功访问Index控制器中的user方法,并且传入参数id=1
U方法具体参数如下:
提示:本人在视频和其他资料中看到的U方法参数和上述的U方法参数有些区别,个人猜想应该是由于版本更新,这个方法也做了些改动。
PATHINFO模式
例如:http://localhost/index.php/home/user/login/var/value/
PATHINFO地址的前三个参数分别表示模块/控制器/操作。
不过,PATHINFO模式下面,依然可以采用普通URL模式的参数方式,例如:
http://localhost/index.php/home/user/login?var=value
依然是有效的
普通模式
普通模式也就是传统的GET传参方式来指定当前访问的模块和操作,例如:
http://localhost/?m=home&c=user&a=login&var=value
REWRITE模式
例如:http://localhost/home/user/login/var/value
,仔细看就会发现,该模式下的url中,省去了index.php,看过去更加的顺眼了。
值得一提的是,如果要使用该模式,不仅仅要修改配置文件,还需在入口文件同级目录下添加.htaccess
文件,内容如下:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
还需将apache服务器开启重写模块
打开apache配置文件,搜索rewrite.so,将最前面的#号去掉,然后重启服务。
兼容模式
当服务器环境不支持pathinfo模式时,可以使用兼容模式。
例如:http://localhost/?s=/home/user/login/var/value
和REWRITE模式一样,需要有.htaccess
文件,内容如下:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L]
</IfModule>
.htaccess解析
内容 | 解析 |
---|---|
<IfModule mod_rewrite.c> | 如果重写模块加载 |
RewriteEngine on | 开启重写引擎 |
RewriteCond %{REQUEST_FILENAME} !-d | 如果请求的资源不是目录,才进行重写 |
RewriteCond %{REQUEST_FILENAME} !-f | 如果请求的资源不是文件,才进行重写 |
RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L] | 重写的规则,使用正则(满足该条件才进行重写) |
</IfModule> | 结束 |