`

Apache的SSI(服务端包含)

阅读更多

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"-->

分享到:
评论

相关推荐

    服务端包含技术_SSI技术

    ### 服务端包含技术_SSI技术 #### 一、SSI技术概述 服务器端包含(Server Side Includes, SSI)是一种简单的服务器端脚本语言,用于在HTML文档中嵌入动态内容。它允许网页开发者将共享的页眉、页脚或其它元素放入一...

    SSI讲解与案例

    **服务端包含(SSI,Server Side Include)技术详解与实战案例** 服务端包含(SSI,Server Side Include)是一种早期的Web开发技术,主要用于在HTML页面中动态插入其他文件内容,如文本、图像、脚本等,以实现部分...

    SSI+Mina2(Struts2+Spring4+Mybatis3+Mina2)集成发布就可运行

    5. **Mina2**:Apache Mina是一个网络通信应用框架,用于简化高性能服务端和客户端的开发。它支持多种协议,如TCP、UDP、HTTP、FTP等,适用于构建网络应用服务器。 描述中提到"都是最新的包,发布就可运行,配置...

    IIS SHTML支持设置方法(SSI)

    找到Web服务扩展(在IIS下面,与网站平行),把“在服务端的包含文件”扩展启用,就可以了。(必须重新启动IIS,否则还是无法访问!)在IIS的定义中,.shtml是SSI组件的一种,必须要把这个启用了。然后你把解析.shtml的...

    11 第十一讲 WEB服务器的构建与管理

    - 支持服务器端包含命令(SSI) - 用户会话跟踪 - 集成Perl脚本编程语言 3. **工作原理** - **HTTP协议**:Web服务器基于HTTP协议运行,它是一种应用层协议,用于传输超文本信息。 - **Browser/Server模式**:...

    struts2+ibatis+spring2.5

    在服务端处理文件上传后,可以结合iBatis进行文件的存储操作,例如将文件保存到数据库或者文件系统。 总结来说,Struts2、Spring和iBatis的整合为Java Web开发提供了强大的功能,结合log4j的日志管理和文件上传功能...

    axis2开发webservice命令

    - `-ssi`: 表示生成客户端和服务端的代码。 - `-t`: 指定输出目录。 #### 四、使用Maven生成WebService客户端代码 对于大型项目而言,手动管理构建过程是非常繁琐且容易出错的。因此,在实际开发中,我们通常会...

    高并发轻量级Web服务器

    它们通常不包含复杂的特性,如CGI(通用网关接口)、SSI(服务器端包含)或动态内容生成,而是专注于提供静态内容,如HTML、CSS、JavaScript和图片文件。这样做的好处是可以减少服务器的计算开销,提高性能。 常见...

    关于iframe的一点发现与思考

    --#include file=""--&gt; 是一种服务器端的包含指令,通常由Web服务器(如Apache、Nginx)解析。这种技术适用于静态内容的复用,但不适用于动态生成的内容。 2. **JSP的Include指令**: - `%@include file=""%&gt;` 是...

Global site tag (gtag.js) - Google Analytics