从上面可以看出这四种兼容模式不是完全独立的。重写模式可以处理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
运营天数
总访问量
文章数量
-
-
-
交流群:157451741
新浪微博:草莽兴
发布评论