专注WEB开发 分享经验,沉淀知识

关于thinkphp的U函数index.php显示与隐藏剖析

 作者:chenxing  时间:2017-09-09 19:31  评论:

从上面可以看出这四种兼容模式不是完全独立的。重写模式可以处理pathinfo模式和兼容模式的路径,兼容模式是普通模式和pathinfo的合体

用thinkphp写的项目多了,有时候会发现U函数有时候输出的url有些情况含有index.php,有些情况没有。

今天就来好好探究一番U函数。

先看一下跟U相关的配置。

'URL_MODEL'      =>  1,
// 0 (普通模式);
//1 (PATHINFO 模式); 
//2 (REWRITE  模式); 
//3 (兼容模式) 
//默认为PATHINFO 模式

我们做一个测试,将这四种模式生成的URL放在一起对比。

// 0 (普通模式);
/index.php?m=Admin&c=Login&a=test
//1 (PATHINFO 模式);
/index.php/Admin/Login/test.html
//2 (REWRITE  模式); 
/Admin/Login/test.html
//3 (兼容模式) 
/index.php?s=/Admin/Login/test.html

这样列出来一起对比,我们就很明显的看出U函数能生成什么的url路径和各种的特点。其中只有重写模式隐藏了index.php。对于U函数要么要明确一点,它只是生成URL字符串的一个工具。

对于具体项目而言应该怎么选择U函数的模式呢?

普通模式

属于通用模式,任何情况下系统都会正确识别这种url。

pathinfo模式

系统默认的模式,作为默认模式当然是一种常用的模式了,pathinfo形式的url很工整,而且系统可以直接通过$_SERVER['PATH_INFO']来获取参数。对于pathinfo它是php的一个功能,既不属于apache等服务器应用,也不是thinkphp独有,它是cgi模式中的传递参数的一种方式。这种路径看起来会优雅很多,早期这么处理也是为了让url对于搜索引擎更友好。

重写模式

如果你项目选择这个,那么你要在web服务器配置定义重写规则。从上面的生成url可观察这种模式隐藏了入口文件‘index.php’,当然你的入口文件也可以是其他的文件名称,以隐藏index.php,在apache为例的,重写规则.htaccess定义如下:

<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

在使用这个模式请务必将.htaccess这个文件放在项目的根目录中,唯有这样系统才能识别U函数生成的这种url。

兼容模式

这个是解决特殊环境中不支持pathinfo而提供的一种模式。这种方式挺有意思,让我们一起分析分析。从生成的url观察它其实是普通模式+pathinfo模式的一种合体。如果环境支持pathinfo那么我们获取参数的方式直接通过$_SERVER['PATH_INFO']进行处理。当系统不支持这个变量时,我们怎能既能正确的获得url中的参数,参数又能像pathinfo那样显示的那么优雅呢?那么兼容模式就提供了这样子的一种方式,通过get方式来获取pathinfo参数。再加上如下的重写规则,那么这个url就和重写模式的url一样完美了。

<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L]
</IfModule>

需要注意的是重写中“^(.*)$ index.php?s=/$1”的“s”变量要和config中“VAR_PATHINFO”变量保持一致。

在这种模式中既然你启用了重写规则,那么直接把模式切换到重写模式。这样U函数生成的路径才会把index.php给隐藏掉。表面上改变了模式,但实际系统处理参数的方式是兼容模式。

从上面可以看出这四种兼容模式不是完全独立的。重写模式可以处理pathinfo模式和兼容模式的路径,兼容模式是普通模式和pathinfo的合体。这四种模式只是他们要解决问题的侧重点不同,一种是表现形式,一种是参数获取。抛开表现形式只看参数获取,url作为php参数获取的形式,get和$_SERVER['PATH_INFO']是从url提取参数的重要手段,从提取的参数中我们区分module,controller,method等重要的参数。至于表现形式,只是为了让url看起来更优雅,不仅对我们还有搜索引擎。

好了,回归到题目中我们把thinkphp U函数index.php显示与隐藏的问题做为切入点,对U函数控制下的四种生成url模式进行剖析,希望对如何更好的在项目中使用U函数有所帮助。

除特别注明外,本站所有文章均为作者原创。 或分享自己的编程经验,或探讨工作中的问题,或聊以人生趣事。 转载请注明出处来自 https://www.qiusuoweb.com/91.html

发布评论

 提交评论
有人回复时邮件通知我

 评论(0)

站长头像
chenxing(PHP攻城狮)

运营天数

总访问量

文章数量

-

-

-

交流群:157451741

新浪微博:草莽兴

 近期文章

聊聊国产化

 2024-08-24 15:56  97

内网穿透工具frp配置详情

 2024-07-18 22:30  192

mac在终端复制出现乱码00~ *** 01~

 2024-07-16 20:38  43

php html生成图片

 2024-07-08 20:25  82

scp命令使用说明

 2024-07-06 12:14  113

如何在当前目录打开终端

 2024-07-04 14:54  84

 最新评论

 tradeOff: 08月30日 10:19
在某些领域国产化是一个迫不得已的事儿
来源: 聊聊国产化
 sue: 07月03日 10:24
可以
来源: 微信小程序如何获取单个input值
 流年: 07月02日 11:31
不错的尝试
来源: 博客系统如何用markdown编辑器发布文章
 诚心: 09月29日 23:01
学到了
来源: 如何一次性推送百万级别的消息
 Nick: 04月14日 12:26
网上的资料还是太老,都只是取一个元素,解决了一大难题
来源: redis set集合取出一组数据并删除
 skywalker: 11月03日 18:21
简洁明了
来源: mysql 获取某个日期的前一天或后一天