本系列文章试图讲述从最古老的动态web技术到时下最流行的php,jsp等技术的历史发展脉络,虽然很多技术已经被历史的长河所淘汰,又或者在某些方面偶尔还有应用,了解这些技术并不是为了让大家再去使用它们,而是从中一瞥技术的发展脉络,了解各个时期的技术的优缺点,从而知道为什么当下的流行技术如此这般,它又面临着什么问题,未来技术的发展方向又是什么等等。以史为镜,可以知兴替。
SSI全称 Server Side Include(服务器端包含)是一门比较老的技术,具体出现时间已不可考,可能是上世纪90年代,记得十年前还经常能看到.shtml (Server-Parsed HTML)后缀的网页,这种后缀就是使用SSI技术的默认后缀名,目前已基本看不到这类网页了。SSI提供一系列指令给开发者使用,指令放在一对特殊的标记(<!--# -->)里,一般格式为 <!--# command parameter1=value1 parameter2=value2 ... -->, 如果服务器不支持SSI,改指令会被浏览器当作注释不会被显示出来,如果当前服务器支持SSI,则会执行其中的指令,然后再返回给用户。由于SSI并不是一个标准的协议,每家服务器厂商对于SSI的实现也都不尽相同。下面以Nginx服务器为例,介绍下SSI如何使用。
location ~ \.shtml$ {
ssi on;
}
然后写一个简单的shtml页面:demo.shtml
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<!--# include file="header.html" --> <!-- 包含头文件 -->
<!--# set var="var1" value="这是一个变量值...." --> <!-- 设置变量 -->
<h2><!--# echo var="var1" --></h2> <!-- 输出变量值 -->
<!--# config timefmt="%Y-%m-%d %H:%M:%S" --> <!-- 设置时间显示格式 -->
<i>当前系统时间:<!--# echo var="date_local" --></i> <!-- 输出当前的服务器时间 -->
</body>
</html>
再在同一个目录下添加一个头文件:header.html
<header>
<h1>这是一个演示SSI的demo</h1>
<p>欢迎来到我的博客,您的到来就像一只蝴蝶飞进了花园</p>
</header>
而且刷新页面可以发现时间是不停变化的浏览器收到的源码:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<header>
<h1>这是一个演示SSI的demo</h1>
<p>欢迎来到我的博客,您的到来就像一只蝴蝶飞进了花园</p>
</header> <!-- 包含头文件 -->
<!-- 设置变量 -->
<h2>这是一个变量值....</h2> <!-- 输出变量值 -->
<!-- 设置时间显示格式 -->
<i>当前系统时间:2017-06-21 16:18:01</i> <!-- 输出当前的服务器时间 -->
</body>
</html>
这样就实现了一个最简单的动态网页效果, SSI还可以使用if判断,例如:
<!--# if expr="..." -->
...
<!--# elif expr="..." -->
...
<!--# else -->
...
<!--# endif -->
更多关于Nginx SSI的使用请参考官方文档:http://nginx.org/en/docs/http/ngx_http_ssi_module.html
某些服务器的SSI还支持操作数据库的能力,比如微软的IIS。从上面的介绍可以看出,SSI已经实现了一些基本动态网页的功能,但它本身支持的功能还很有限,并不是一门真正的编程语言,而且对于服务器执行SSI中指令需要查找整个html文档,这会加重服务器的负担,再加上SSI并不是一个标准的协议,各家实现不同,也不利于网站的移植,所以SSI肯定会被更好的解决办法所替代,比如更强大的CGI技术和之后的ASP技术。