SSI是什么?
Server Side Include,通常称为服务器端嵌入,是一种类似于ASP的基于服务器的网页制作技术。从技术角度上说,SSI就是html文档中,能够通过注释行调用的命令或指针。SSI 具备强大的功能,只要使用一条简单的SSI 命令就能够实现整个网站的内容更新,动态显示时间和日期,连同执行shell和cgi脚本程式等复杂的功能。SSI最初在ncsa服务器平台上推出,在apache服务器中得到扩展和加强,现在已能够在几乎任何的服务器上运行。
为什么用SSI?
用个例子来说明,一个静态化的页面中,需要嵌入一小块实时变化的内容,。例如首页,大部分的页面内容需要缓存但是用户登录后的个人信息是动态信息,不能缓存。那么如何解决这个”页面部分缓存”问题,利用SSI就可以解决,在首页的静态页面中嵌入个人信息的动态页,由于是服务器端的嵌入,所以用户浏览的时候都是一个嵌入后的页面。
Nginx配置SSI?
主要是三个参数,SSI,SSI_silent_errors和SSI_types,均可以放在http,server和location的作用域下。
SSI on
开启SSI支持,默认是off
SSI_silent_errors on
默认值是off,开启后在处理SSI文件出错时不输出错误提示:”[an error occurred while proceSSIng the directive] ”
SSI_types
默认是SSI_types text/html,所以如果需要htm和html支持,则不需要设置这句,如果需要shtml支持,则需要设置:SSI_types text/shtml
页面上配置
<!–# include file=”/m/2013/4/15/index_top.html”–>
<!–# includevirtual=”/m/2013/4/15/index_top.html”–>
示例
1.开启shtml后缀的文件名支持SSI
server{
……
SSI on;
SSI_silent_errors on;
SSI_types text/shtml;
}
2.开启html后缀的文件名支持SSI
server{
……
SSI on;
SSI_silent_errors on;
}
3.在zt目录下开启html后缀的文件名支持SSI
server{
……
location /hx/{
SSI on;
SSI_silent_errors on;
}
}
SSI语法?
SSI在使用时遵循以下格式:
<!--#directiveparameter="value"-->
其中,directive是向服务器发送的指令名称,parameter是指令的操作对象,而value则是用户希望得到的指令处理结果。
*任何的SSI命令都是以"<!--#"开始,其中"<!—"和"#"之间不能有任何空格,否则服务器会把SSI命令当称普通的文档注释处理,不会显示出任何结果,也不会产生错误提示。此外,SSI命令中的"="两边不能有空格,右边的值必须包含在双引号内,后面能够跟空格,最后是结束标签"-->"。
SSI命令包含六大类指令连同各自的参数,具体如下:
directive |
parameters |
config |
errmsg, timefmt, sizefmt |
include |
virtual, file |
echo |
var |
fsize |
file |
flastmod |
file |
exec |
cmd, cgi |
技术简介:
1.config命令
config命令主要用于修改SSI的默认配置。其中:
errmsg:配置默认错误信息。为了能够正常的返回用户设定的错误信息,在html文档中errmsg参数必须被放置在其他SSI命令的前面,否则客户端只能显示默认的错误信息,而不是由用户设定的自定义信息。
<!--#config errmsg="error! please [email protected] -->
timefmt:定义日期和时间的使用格式。timefmt参数必须在echo命令之前使用。
<!--#config timefmt="%a, %b %d,%y"-->
<!--#echo var="last_modified"-->
显示结果为:
wednesday, april 12, 2000
sizefmt:决定文档大小是以字节、千字节还是兆字节为单位表示。假如以字节为单位,参数值为"bytes";对于千字节和兆字节能够使用缩写形式。同样,sizefmt参数必须放在fsize命令的前面才能使用。
<!--#config sizefmt="bytes"-->
<!--#fsize file="index.html"-->
2.include命令
include命令能够把其他文档中的文字或图片插入到当前被解析的文档中,是整个SSI的关键所在。
include命令具备两个不同的参数,假如使用错误的参数更新站点的话,不但达不到初衷,反而会得到一大堆的错误信息。
virtual:给出到服务器端某个文档的虚拟路径。例如:
<!--#include virtual="/includes/header.html" -->
为了更加合理的组织站点的内容,用户能够在根目录下创建includes子目录来存放任何的包含文档。virtual参数能够通知服务器所要包含的是个虚拟文档,即文档和当前被解析的文档不是位于同一个目录,而是存放在其他目录中。服务器会根据该参数的值找到根目录下的includes子目录。使用这种方法,用户能够把任何html文档包含的文档放在一个目录中,而根据相互之间的关系把不同的页面保存在不同的目录或子目录中。无论服务器解析哪一个文档都能够找到所包含的文档,不会产生任何错误。
一般我们都会在页面中加入一些title和meta标签,假如我们规定任何的页面都调用相同的页眉文档的话,就显得很不灵活。用户碰到这样的问题时,能够使用两个包含文档,一个配置title标签前的内容,另一个配置meta标签后的部分,而在两个包含文档之间则能够添加任何定制内容。例如:
<!--#include virtual="/includes/header1.html"-->
<title>your page title</title>
<link rel = stylesheet href ="http://domain.com/styles/my.css" type = "text/css" >
<meta name = "description" content= " description of page">
<meta name = "keywords" content= "keywords for page" >
<!--#include virtual="/includes/header2.html"-->
这里放置页面内容
<!--#include virtual="/includes/footer.html"-->
从上我们能够看出通过在页面中包含页眉和页脚能够大大减少站点更新的工作量。但是假如我们希望动态显示一些内容,例如页面的最后更新时间等该怎么办呢?没问题,我们能够把包含文档使用.html后缀保存,这样就能够在包含文档中调用其他的包含文档。
file:给出到当前目录的相对路径,其中不能使用"../",也不能使用绝对路径。例如:
<!--#include file="header.html" -->
这就需要每一个目录中都包含一个header.html文档。当然,采用这样的方法并不比更新每一个页面简单多少,但是假如用户只更新一、两个文档的话还是很方便的。例如,假如我们不希望让一个对html不熟悉的人直接改变网站中的新闻页面的话,能够只让他更新一个单独的文本文档,然后再把该文档包含到hmtl文档中,这样即不会破坏原页面,同时又更新了内容,两全其美。
3.echo:
echo命令能够显示以下各环境变量:
document_name:显示当前文档的名称。
<!--#echo var="document_name" -->
显示结果为:
index.html
document_uri:显示当前文档的虚拟路径。例如:
<!--#echo var="document_uri" -->
显示结果为:
/yourdirectory/yourfilename.html
随着网站的不断发展,那些越来越长的url地址肯定会让人头疼。假如使用SSI,一切就会迎刃而解。因为我们能够把网站的域名和SSI命令结合在一起显示完整的url,即:
http://yourdomain<!--#echo var="document_uri" -->
query_string_unescaped:显示未经转义处理的由客户端发送的查询字串,其中任何的特别字符前面都有转义符"\"。例如:
<!--#echo var="query_string_unescaped" -->
date_local:显示服务器设定时区的日期和时间。用户能够结合config命令的timefmt参数,定制输出信息。例如:
<!--#config timefmt="%a, the %d of %b, in the year %y"-->
<!--#echo var="date_local" -->
显示结果为:
saturday, the 15 of april, in the year 2000
date_gmt:功能和date_local相同,只但是返回的是以格林尼治标准时间为基准的日期。例如:
<!--#echovar="date_gmt" -->
last_modified:显示当前文档的最后更新时间。同样,这是SSI中很实用的一个功能,只要在html文档中加入以下这行简单的文字,就能够在页面上动态的显示更新时间。
<!--#echovar="last_modified" -->
cgi环境变量
除了SSI环境变量之外,echo命令还能够显示以下cgi环境变量:
server_software:显示服务器软件的名称和版本。例如:
<!--#echo var="server_software" -->
server_name:显示服务器的主机名称,dns别名或ip地址。例如:
<!--#echo var="server_name" -->
server_protocol:显示客户端请求所使用的协议名称和版本,如http/1.0。例如:
<!--#echo var="server_protocol" -->
server_port:显示服务器的响应端口。例如:
<!--#echo var="server_port" -->
request_method:显示客户端的文档请求方法,包括get, head, 和post。例如:
<!--#echo var="request_method" -->
remote_host:显示发出请求信息的客户端主机名称。
<!--#echo var="remote_host" -->
remote_addr:显示发出请求信息的客户端ip地址。
<!--#echo var="remote_addr" -->
auth_type:显示用户身份的验证方法。
<!--#echo var="auth_type" -->
remote_user:显示访问受保护页面的用户所使用的帐号名称。
<!--#echo var="remote_user" -->
4.fsize:显示指定文档的大小,能够结合config命令的sizefmt参数定制输出格式。
<!--#fsizefile="index_working.html" -->
5.flastmod:显示指定文档的最后修改日期,能够结合config命令的timefmt参数控制输出格式。
<!--#config timefmt="%a, the %d of%b, in the year %y" -->
<!--#flastmod file="file.html"-->
这里,我们能够利用flastmod参数显示出一个页面上任何链接页面的更新日期。方法如下:
<!--#config timefmt=" %b %d,%y" -->
<a href="/directory/file.html">file</a>
<!--#flastmod virtual="/directory/file.html"-->
<a href="/another_directory/another_file.html">anotherfile</a>
<!--#flastmod virtual="/another_directory/another_file.html"-->
显示结果为:
file april 19, 2000
another file january 08, 2000
也许有的读者会认为两个链接就这么复杂,一点也不方便。其实,假如页面上有20个或更多的链接,而且每个链接都定期更新的话,就能够看出使用flastmod显示修改日期的作用。
6.exec
exec命令能够执行cgi脚本或shell命令。使用方法如下:
cmd:使用/bin/sh执行指定的字串。假如SSI使用了includesnoexec选项,则该命令将被屏蔽。
cgi:能够用来执行cgi脚本。例如,下面这个例子中使用服务端cgi-bin目录下的counter.pl脚本程式在每个页面放置一个计数器:
<!--#execcgi="/cgi-bin/counter.pl" -->