SO.闲着也是闲着,平时我也喜欢逛逛论坛写写博文啥的,TP官网我也是常客啦。
经常看到求助区一些在老手看来十分无语的问题,比如TP怎么无法加载JS啦,TP模板中使用../怎么不是模板上级目录啦,网页中JS生成的值怎么再使用PHP处理啦等等。。
总归起来呢,其实就是对B/S结构的了解不够,闲着也是闲着,在下斗胆以为对这方面的理解还算清晰,至少开发过程中不会因为以上问题浪费时间,所以决定这几天做一个 B/S 旅途系列的文章,希望能够以通俗的解释让后来的新人们形成一个直观的印象,在开发过程中减少一些误区,提高效率。
PS.本人没有经过正规的计算机科班教育,也没有上过培训班,一些术语啊,逻辑啊有错误的话,欢迎指出,在下会立即修正,先提前感谢了!
【预备】
B/S 全称 Browser/Server即 浏览器/服务器 ,什么意思呢?我们开发一个网站是要放在服务器上的对吧?就是这里的S,那我们通过什么访问网站呢?答案是浏览器对吧?就是这里的B。概括起来就是通过浏览器访问服务器上面的应用。而与之区别的C/S就是在电脑上安装指定的客户端软件才能访问到服务器上的数据,详细的定义还请自己谷歌一下`(*∩_∩*)′。
这里不打算先介绍B或者S,而是先介绍一下URL,俗称网址。
【URL篇】
当我们想要访问TP官网的时候,我们理所当然打开浏览器(Browser),熟练的在地址栏打上一个网站的网址(当然某些同学喜欢用导航网站打开百度,再搜ThinkPHP的,我想说,请专业点*^_^* 开个玩笑,方便第一~),这个网址就是本篇所要讲解的URL啦。
通常我们见到的URL由 http:// , 域名,目录,文件名,查询参数组成,某些情况下文件名可以隐藏,例如TP的index.php。
先来讲讲域名,域名是个嘛玩意呢?它是万维网的产物,将一个域名解析到某个IP上,当你在浏览器地址栏中键入这个域名时,实际上访问的是它所指向的IP,当然为了能够IP所属服务器知道你是通过http访问的,实际上浏览器会自动将一些必要的信息附在头部在请求的同时发送给服务器,这样服务器可以根据这些信息做出判断,用户所访问的是哪个域名,这个域名在服务器上有没有绑定,如果没有绑定的话则out,有绑定的话就访问站点所在目录,当然这些过程说起来也麻烦,这里不说太多。
假设我们在apache上绑定了一个域名www.thinkphp.cn,并将这个域名的根目录设置为/var/www/thinkphp/ 而我们的项目位于这个目录中,结构如下:
根目录---/var/www/thinkphp/
公共目录----Public/
项目目录-----home/
入口文件----index.php
TP核心---- Think/
实际上当我们访问 www.thinkphp.cn 时,apache会知道,如果设置了默认首页文档为index.php那么会默认访问 /var/www/thinkphp/ ,下面列出几个例子:
www.thinkphp.cn/index.php => /var/www/thinkphp/index.php
www.thinkphp.cn/Public/js/jquery.js => /var/www/thinkphp/Public/js/jquery.js
www.thinkphp.cn/Public/ => /var/www/thinkphp/Public/index.html (默认首页文档为index.html index.php 优先级从左到右)
www.thinkphp.cn/index.php/Index/index => /var/www/thinkphp/index.php 看起来好像 /Index/index是目录,实际上由于pathinfo特性,访问的是index.php,而后面的内容全部保存到$_SERVER['PATH_INFO']环境变量中了。
也就是说,在域名后面加上 /目录名/ 实际上访问的是域名对应站点根目录下的子目录。
很多朋友说,我在本地测试是 __ROOT__ 是有值的,到了服务器环境下就变成空的了,这里废点口舌解释下:
首先确定1件事:
你本地测试,项目肯定是在 localhost/xxx 下
大多数人应该用的是集成环境,比如xampp 默认localhost 实际上指向的是xampp安装目录下/htdocs/目录,当你访问 localhost/xxx/index.php/Index/index时,实际上访问的就是 E:/xampp/htdocs/xxx/index.php
而__ROOT__这个TP常量是啥?它是当前项目相对于站点根目录的一个位置,比如你本地项目位于 E:/xampp/htdocs/xxx/ 但是你通过localhost/xxx访问的,而localhost的站点根目录就是 E:/xampp/htdocs/ 所以你项目相对于根目录的位置实际上就是 xxx/ ,而当你将项目部署到服务器上时,由于你给项目使用了一个单独的域名,而这个域名所绑定的目录就是你的 xxx目录,所以这时候站点根目录实际上变成了 xxx/ ,你项目就在xxx/下面,而__ROOT__是项目相对于根目录的位置,这时候你项目所在目录就是根目录,这个位置当然就是空咯,所以这时候__ROOT__就是空。
再来说说URL相对路径、绝对路径,很多朋友喜欢在模板中的链接使用相对路径,它看上去是这样的:
<li
大家也知道,我们将样式文件st
它是正常的,因为实际上样式加载的文件路径是
localhost/xxx/Public/st
但是当我们访问其他模块时,如localhost/xxx/Test/index ,我们访问的是Test模块中的index方法,这时候样式还能正确加载吗?答案是否定的。
因为加载样式是浏览器干的活,浏览器不知道你实际上是pathinfo模式,它只会根据你的url来拼接链接,规则如下:
1.若是相对路径,则将href中的字符串加到当前地址栏中最后一个 "/"后面
2.若是绝对路径,则将href中的字符串加到域名/后面
所以这里实际上样式路径变成了localhost/xxx/Test/Public/st
那么什么是绝对路径呢?只要在href中除去域名以 / 开头。比如上面的样式文件
<li
这样就是绝对路径,浏览器解析的时候,会这么处理 localhost/Public/st
所以TP提供了一个模板"常量" : ../Public(只能在模板中使用,并非真正的PHP常量,只是模板渲染的时候会将特定的字符串替换).
在TP渲染模板时会自动将 ../Public 替换成当前项目中的 Public 目录所对应的绝对路径,比如这里就是 /xxx/Public
在模板中完整的写法如下:
<li
当你浏览器打开页面的时候,你查看源代码看到的应该是
<li
瞧,转换成了当前环境下项目的绝对路径。所以可以放心的迁移到服务器上单独绑定域名也不会出错。
一般情况下 ../ 表示上级目录,没错,对于浏览器来是的,但是之所以让你查看源代码就是为了让你知道我们浏览器最终看到的不是 ../ 实际上它在服务器上已经被替换了。
那么如果最终网页源代码中,链接里出现了 ../ 是怎么解析的呢?
例如
<li
这是我们浏览器最终接收到的html源代码
我们开始模拟解析,这个href,从左边开始
1.进入localhost/xxx/
2.进入localhost/xxx/Public/
3.进入localhost/xxx/Public/images/
4.发现../,退回上一步,回到2中的 localhost/xxx/Public
5.在localhost/xxx/Public/ 下发现st
很容易理解不是?一定要搞清楚,在最终页面显示出来以后,已经跟服务器没关系了。浏览器只会将路径逻辑跟当前地址栏中的url进行交配。
所以有些同学反映说模板中使用 ../ 怎么不是xxx/Tpl/目录啊,这些都是低级错误,希望看了上面的拙见能够有一个新的理解。
今天就写到这里,我们下期再见,额,还没想好下期的标题`(*∩_∩*)′
最佳答案