本文所针对的对象是那些热爱WEB技术,喜欢动手建站的朋友们。使用PHP框架,开源程序的不推荐,当然Smarty模板的可以留下看看。
为什么
也许,这个问题都是很多刚学习的程序员喜欢问的一个问题。如果你没有独立建过一个完整的网站,或者没有应对上千万PV压力的站点经营管理过那么你就不会感觉到目录部署的至关重要。可能很多童鞋认为只要程序写的好,目录都不是问题,程序才是核心。
其实Web项目目录部署也算是程序设计的一个重要部分,一个好Web目录部署不仅在维护、管理、拓展方便都灵活,对于数据量多的站点更是一种程序设计思想。因此在开始一个Web项目之前,目录的部署应该是首要考虑的。
按域名建目录
通常在一个VPS或者服务器上,都会跑N个站点。所以,每个站点按域名建目录一目了然,以后想管理哪个站点直接就能找到相关目录。
├── www.qttc.net
├── www.hngdwk.com
├── www.daybaby.com
└── www.lizhong.me
以上为我自己VPS上的站点,一个站点一个目录。这些站点目录都放在一个web_root目录里。这样,以后我只要进入web_root目录,只要看目录就知道服务器上有几个站在跑,每个站的域名是什么,每个目录占用多少磁盘都清清楚楚。
站点目录按可访问与不可访问区分
在以上基础上,可能有些童鞋配置虚拟主机的时候会直接把目录定到域名目录下,这点强烈不推荐。因为一个WEB项目里有些内容是可以在浏览器里直接能看,有些则不需要,也可以说是为了安全方面。
看看以下结构
├── www.qttc.net
│ ├── config
│ ├── www
│ ├── exec
│ ├── main.pyc
│ ├── model
│ ├── static
│ └── templates
├── www.hngdwk.com
├── www.daybaby.com
└── www.lizhong.me
从截图上看,在www.qttc.net
目录下又有很多个目录,其中有一个www
的目录,这个www
目录就是虚拟主机指定的目录。也就是我们通过浏览器访问的时候,实际上不是访问htdocs/www.qttc.net
目录,而是访问htdocs/www.qttc.net/www
目录。
为何要这么设计呢?
在www.qttc.net
目录下有除了www
以外的目录,这些目录里都存放着一些配置文件或者根本不想暴露在浏览器能访问的路径里。
以上是我这个小站的目录部署,当然因项目实际情况不一定非得这么部署,但大体基本都这样设计。因为数据库操作类,网站配置等等不需要放在www目录下,这样不仅显得www目录比较混乱,而且不安全。
这里有一点要说明的是admin目录,可能大家都见过不少网站的管理路径直接是www.xx.com/admin
域名后面加个admin即可。其实这样的目录设计不安全,我直接把管理目录提出出来,通过另外的域名才能管理后台,至少我感觉这样的设计会更安全一些。
哪些文件应该放在可访问www目录下?
只要需要浏览器通过地址栏访问到的文件,都要放在www目录下。栏目页面,JS,图片,CSS都需要放在www目录下,因为浏览器不能访问www目录以外的文件。而PHP是服务器端的,所以PHP可以通过绝对路径或者../../这样的方法访问www目录以外的内容。
├── js
├── api
├── css
├── images
└── index.html
其中api是接口文件,主要ajax异步请求的接口,我们需要放在www下,否则ajax通过http地址请求不到。plug下是一些插件,比如我站点的高亮插件,因为这个插件是前端JavaScript的,所以只能放在www目录下。
其实应该还有一个upload目录,是用于上传图片的存放目录,这里推荐上传的文件最好分子目录存放,不要全部都放在upload路径下。因为系统有最高文件数上限,可能前期文件少项目没啥问题,但当你上传的文件越来越多就会出现问题了。可以按年建文件夹,如果你上传的图片非常频繁,而且数量很多,可以按年月,如201208
、201209
等等。
静态文件夹目录部署
这个是指生成静态文件以后存放目录。之前,我是直接按ID生成html存放在html目录下。后来发现这样不行,因为系统目录最大文件数限制以外,还有不好管理。待以后你发布的文章上千篇时虽然不会到达目录最大文件上限,但这么多文件都放在一个文件夹里不好管理,于是我就按年月。如我发布的这篇文章ID是158,当前的时间是2012年8月,于是我就生成158.html
放在html/201208
文件夹下。
如果使用Smarty的朋友可以模板与编译文件都放在www以外。
最后
Web目录部署没有固定方案,每个项目可以根据自身特点来部署。但目录部署一定要花点心思与功夫,为以后的拓展与维护铺下奠基。特别是项目较大的,更应该重视常用的目录部署方案,结合需求设计一套优秀的目录部署方案。