首页 理论教育ThinkPHP支持4种URL模式+介绍新式URL模式

ThinkPHP支持4种URL模式+介绍新式URL模式

【摘要】:ThinkPHP共支持4种形式的URL模式,分别为普通模式、PATHINFO模式、REWRITE模式和兼容模式。下面分别对4种URL进行讲解。接下来将介绍另外一种比较新式的URL模式。

ThinkPHP共支持4种形式的URL模式,分别为普通模式、PATHINFO模式、REWRITE模式和兼容模式。这4种URL构成了ThinkPHP MVC任务请求的核心,开发人员可以通过配置文件进行指定,4种URL模式根据Web服务器的差异,支持有所不同(有些服务器如Nginx、lighttpd需要读者自行配置),从目前的使用情况来看,在Apache中运行得最完美,开发人员不需要特别的设置均可以在4种URL中自由切换。下面分别对4种URL进行讲解。

1.普通模式

本质上ThinkPHP的4种URL都是由普通模式的URL转换而成的,普通模式是整个URL处理模式的基础。普通模式下的URL显得比较长,各参数需显式传递,过长的URL对搜索引擎并不友好,但是普通模式能够支持任何Web服务器,对开发人员而言也显得比较友好。普通模式下URL格式如下。

http://tp.localhost/index.php?a=index&m=index&username=ceiba

普通模式URL和常见的网站URL非常类似,它是以显式的参数作为传递方式。其中参数a表示控制器的动作(即模型类中的方法);参数m指定控制器名称。除了需要指定这两个参数之外,开发人员可以附加更多自定义参数,附加的自定义参数在控制器动作中可以使用$_G[“参数名称”]方式进行获取。如果请求的控制器和动作都为index,那么可以省略该请求参数,格式如下。

http://tp.localhost/index.php?username=ceiba

上述URL的请求结果是和前面URL请求结果是一样的。普通URL模式不需要修改Web服务器配置,只需要修改配置文件参数URL_MODEL=0即可;普通的URL模式是早期ThinkPHP的默认URL模式,也是众多网站所使用的方式,但无论对用户还是搜索引擎都显得不友好,所以现在很少使用了。接下来将介绍另外一种比较新式的URL模式。

2.PATHINFO模式

PATHINFO模式能够提供一种简短、友好的URL形式,是ThinkPHP默认的URL模式。PATHINFO模式是利用ThinkPHP的路由功能实现的,它的实现原理与URLRewriter相类似,但是ThinkPHP不依赖于Web服务器的正则,框架自身已经有一套URL正则处理机制,开发人员甚至不需要部署.htaccess文件,所以PATHINFO能够兼容绝大多数Web服务器。PATHINFO模式的URL格式如下。

http://tp.localhost/index.php/index/content/username/ceiba

PATHINFO为ThinkPHP默认的处理模式,能够显著改善URL形式,提高用户体验。PATHINFO清楚地表达MVC的处理过程,如图6-1所示。

如图中所示,在整个请求的URL字符串中,对于开发者而言只需要记住两项参数,即控制器(index)和content(动作),前后顺序不能改变。其余的参数(选项)均可作为需要传递的GET参数,如username/ceiba与&username=ceiba作用是一样的,如果需要传递更多参数,依次类推,附加上即可。

978-7-111-42852-7-Part02-99.jpg

图6-1 PATHINFO模式

入口网址后的参数分隔符是可变的,开发人员可以通过修改URL_PATHINFO_DEPR配置参数实现需求,默认URL_PATHINFO_DEPR=”/”,常见的分隔符为“_”、“,”、“-”等,但不能使用“:”、“&”、“?”作为分隔符。

PATHINFO的本质是使用PHP解释引擎中的$_SERVER['PATH_INFO']数组实现的,能不能使用PATHINFO模式还得看服务器支不支持$_SERVER['PATH_INFO'],通常情况下常见的Web服务器如Apache、IIS等都能够很好地支持。如果是反向代理一类的Web服务器(例如Nginx、lighttpd),需要额外调用CGI(详细可阅读本书附录A)。(www.chuimin.cn)

PATHINFO配合服务器的RewriteRule功能,还可实现隐藏index.php。在Apache中只需要开启mod_rewrite模块即可(XAMPP开发套件已默认开启),然后配置网站中的.hessace文件(与入口文件同级),如以下代码所示。

978-7-111-42852-7-Part02-100.jpg

重启Apache服务器后,此时就可以使用http://tp.localhost/index/content/username/ceiba代替http://tp.localhost/index.php/index/content/username/ceiba网址了。隐藏index.php文件后,不仅让URL更加友好和简洁,同时也让URL更加通用

‰ 提示:Ajax、SOAP、移动终端请求等许多应用是不支持PATHINFO模式的,甚至不支持普通的模式,这时使用隐藏index.php文件后的PATHINFO模式,能够让URL被任何类型的应用调用(因为会被解释成目录)。

3.REWRITE模式

REWRITE模式就是URL重写规则,它能够完全实现PATHINFO模式的所有功能,还能够利用服务器的URL重写功能,实现更完善的URL模式。REWRITE不使用PHP的PATCHINO功能,能不能支持REWRITE模式关键要看服务器支不支持RewriteRule功能(绝大多数都是支持的)。REWRITE模式需要读者额外熟悉Web服务器的各项配置,这不是本书的重点。以下.htaccess文件代码为笔者常用的REWRITE配置,它能够模拟基本的PATHINFO。

978-7-111-42852-7-Part02-101.jpg

978-7-111-42852-7-Part02-102.jpg

4.兼容模式

普通模式能够保证网站在所有支持PHP的Web服务器下正常运行,但是由于用户体验差,对搜索引擎不友好已经很少被采用了;而PATHINFO模式虽然有效地改善了URL形式,提高了用户体验,是所有MVC框架所采用的主流方式,但由于受限于一些服务器,PATHINFO并不能完美地让项目适用于任意场景,所以ThinkPHP提供了URL兼容模式。兼容模式能够让普通模式与PATHINFO模式互相切换,对开发者而言整个项目不需要修改代码,ThinkPHP可以智能地处理普通模式与PATHINFO模式之间的切换。兼容模式的URL表现形式如下所示。

http://tp.localhost/index.php/?s=/index/content/username/ceiba/

兼容模式结合了普通模式和PATHINFO的特点,在表现形式上是一种折中的方案,并不是好的MVC URL模式,它的最大好处就是能够确保网站运行在任何Web服务器。

事实上兼容模式本质上还是普通模式,它由参数s传递MVC所需要的参数(s参数后的分隔符由URL_PATHINFO_DEPR配置项指定),一般用于开发阶段的调试。要启用兼容模式,只需要修改配置项’URL_MODEL’=>3即可。

上述4种URL模式读者可根据需要进行选择,但无论是从用户体验还是对搜索引擎友好考虑,笔者都建议使用PATHINFO或REWRITE模式。如果需要做成全兼容的网站(如供第三方调用的接口、SOAP等)还需要隐藏入口文件(当然接来下要介绍的URL路由也是一种解决方案),为了便于讲解,统一规范,如无额外说明,本书后面的所有内容都将使用PATHINFO作为URL请求模式。