SSI(服务器端包含)提供了一种对现有HTML文档增加动态内容的方法。
作用:
一般出于效率的考虑,网站都会把内容尽可能的静态化成HTML文件,但是网站页面的布局往往比较复杂,各个部分的更新频率并不一致,比如说:一个显示“文章内容”的页面,很可能在旁边会有一个“每天最热文章TOP10”之类的列表,这个列表的内容是要每天更新的,而文章内容本身一般不会那么频繁的更新,对于这样的问题可以用Apache的SSI来解决,从感觉上讲,其作用和PHP中的inlucde文件类似。
配置:
配置SSI很简单,既可以把配置代码写在httpd.conf里,也可以写在.htaccess文件里,这里以httpd.conf文件为例来说明,打开你的httpd.conf文件,在相应的<Directory "......">里只要键入下面代码就可以激活SSI:
Options Includes
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
这样,你所有扩展名为shtml的文件都具有了SSI的能力,这里需要注意的是,如果我们不需要在shtml文件里执行exec指令,那么就应该尽可能的禁止它,以便获得最大的安全性,所以推荐的配置代码变成:
Options IncludesNOEXEC
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
注意:以上配置代码以Apache2.0.X版本为准,如果你的版本属于Apache1.3.X系列,则其中的“AddOutputFilter INCLUDES .shtml”应该换成“AddHandler server-parsed .shtm”。
另外还有一种XBitHack的配置方法,但是并不推荐,想了解的可以看手册。
应用:
下面看看具体页面应该如何编写,还是以开头说的情况为例,我们假设“每天最热文章TOP10”的代码每天都会由Crontab程序自动静态化成top10.html文件,那么在我们的文章显示页面的里,可以使用如下的代码来引用top10.html页面:
1. <!--#include file="top10.html"-->
2. <!--#include virtual="top10.html"-->
file和virtual的区别在于:file属性是一个相对于当前目录的文件路径,即不能是一个绝对路径以“/”开头或包含“../”的路径。virtual属性可能更有用,它是一个相对于被提供的文档的URL ,可以以“/”开头,但必须与被提供的文档位于同一服务器上。
当然,SSI的能力远不止于此,手册上对相关的指令有详细的介绍,这里只是介绍了SSI最常用的功能而已。
实战:
某公司有一个CMS(文章管理系统),首页,列表页,显示页都已经静态化,相应的头尾部分使用SSI搞定,大致如下:
<!--#include virtual="head.shtml"-->
<!--#include virtual="foot.shtml"-->
此时,业务部门和一些公司达成了许多合作意向,其中一条是我们的网站的每个页面都要加上对方网站的头和尾,粗看起来问题比较棘手,因为我们的网站都已经静态化了,难道我们要为每个合作公司再拷贝一份网站不成,那当然是不现实的,别忘了,我们网站原来的头尾都已经使用SSI分离出来了,而且使用的还是shtml格式的头尾,这就是说明我们还可以在头尾文件里包含合作公司的头尾来完成需求,等等,似乎还有疑问,合作公司那么多,我们怎么区分呢?很简单,为每个公司指定的一个子域名,如:A公司的合作页面域名为“a.domain.com”,类推,然后在已经有的SSI文件(head.shtml和foot.shtml)里的适当位置加入下面代码:
<!--#include virtual="${SERVER_NAME}.head.shtml"-->
<!--#include virtual="${SERVER_NAME}.foot.shtml"-->
其中“SERVER_NAME”是环境变量,说白了,就是你为公司指定的那个子域名。如果对应公司的头尾文件都准备好了,那就浏览吧,应该可以自动根据域名来动态加载相应的头尾文件了吧,^_^,搞定!
------------------------------------------------------------------
补充:今天一台服务器的httpd进程超多,感觉负载过大,所以决定干掉apache,网站迁移到lighttpd上,本来一切顺利,但是安装好后,浏览的时候发现页面的SSI没有正常加载,里面的代码和上面说的差不多,如下:
<!--#include virtual="${SERVER_NAME}.head.shtml"-->
<!--#include virtual="${SERVER_NAME}.foot.shtml"-->
查了很多,才搞清楚原来apache和lighttpd对SERVER_NAME的解释不同,换成HTTP_HOST就好了,所以以后写SSI的时候,还是应该在可移植性上考虑多点。最终代码如下:
<!--#include virtual="${HTTP_HOST}.head.shtml"-->
<!--#include virtual="${HTTP_HOST}.foot.shtml"-->
出处:http://cn-done.javaeye.com/blog/507472