日期:2014-05-16  浏览次数:20882 次

Apache——SSI 服务器端包含

(参考apache手册及百度百科:http://baike.baidu.com/view/188371.htm)

访问静态页面时,页面有一个模块无法显示并报错“an error occurred while processing this directive”,查看原html文件,发现该处是通过SSI的命令include进来的:

<!--#include virtual="/html/attention/expo.html"-->  通过改正引入文件的路径,成功引入。这里做一下笔记:

【SSI】

     Server Side Include,服务器端嵌入(包含),以apache为例,SSI是通过apche的mod_include模块实现的,是指服务器将内容发送给浏览器之前,根据页面中的指令,对页面进行处理的过程。这是apache中文手册的定义:'SSI是嵌入HTML页面中的指令,在页面被提供时由服务器进行运算,以对现有HTML页面增加动态生成的内容,而无须通过CGI程序提供其整个页面,或者使用其他动态技术。        

至于什么时候应当用SSI,而什么时候应当用某些程序生成整个页面,取决于页面中有多少内容是静态的,又有多少内容需要在每次页面被提供时重新计算SSI一种增加小段动态信息的好方法,比如当前时间。如果你的页面大部分内容是在被提供时动态生成的,那就要另找方案了。


我遇到的是在文章页引入“关注”模块,文章是不变的,但是关注每天都不同,因此采用SSI,以便旧的文章页的关注也能够实时更新。

如何使你的Apache服务端支持SSI?

Apache默认是不支持SSI的,需要我们更改httpd.conf来进行配置。

我这里以windows平台的Apache 2.0.x为例:打开conf目录下的httpd.conf文件,

1. 搜索“AddType text/html .shtml”,搜索结果:  # AddType text/html .shtml  # AddOutputFilter INCLUDES .shtml  把这两行前面的#去掉。  

       (解释: 并非所有文件中的ssi指令都会被解析,必须告诉Apache应该解析哪些文件。如果我们的指令放在了.htm类型的文件中,那么就需要在上面两条命令中分别加入.htm一项,否则便不会解析未指定的文件中的ssi命令。 因为命令是放在注释中的,故不解析的将显示空。

          有两种方法使Apache解析带有特定后缀名的文件,上面这是一种,另一种是使用 xBitHack命令,详见apache手册)

2. 然后搜索“Options Indexes FollowSymLinks”  在搜索到的那一行后面添加“ Includes”  即将该行改变为:  Options Indexes FollowSymLinks Includes

SSI指令基本格式

  程序代码:   <!-– 指令名称="指令参数">

         如 程序代码:   <!--#include file="info.htm"-->

         说明: 1.<!-- -->;是HTML语法中表示注释,当WEB服务器不支持SSI时,会忽略这些信息。  

              2.#include 为SSI指令之一。  

              3.file 为include的参数,info.htm为参数值,在本指令中指将要包含的文档名。  

         注意: 1.<!--与#号间无空格,只有SSI指令与参数间存在空格。  

              2.上面的标点="",一个也不能少。  

              3.SSI指令是大小写敏感的,因此参数必须是小写才会起作用。

SSI指令

     除了include指令,ssi还有很多很帅的指令,如:echo config exec set 甚至条件表达式if else ,详细见apache手册。