其他 · 2010 年 11 月 19 日 0

apache服务器启用SSI和使用详解

你是否曾经或正在为如何能够在最短的时间内完成对一个包含上千个页面的网站的修改而苦恼?那么可以看一下本文的介绍,或许能够对你有所帮助。

什么是ssi?

ssi是英文server side includes的缩写,翻译成中文就是服务器端包含的意思。从技术角度上说,ssi就是html文件中,可以通过注释行调用的命令或指针。ssi 具有强大的功能,只要使用一条简单的ssi 命令就可以实现整个网站的内容更新,动态显示时间和日期,以及执行shell和cgi脚本程序等复杂的功能。ssi 可以称得上是那些资金短缺、时间紧张、工作量大的网站开发人员的最佳帮手。

ssi最初在ncsa服务器平台上推出,在apache服务器中得到扩展和加强,目前已经可以在几乎所有的服务器上运行。本文将主要结合apache服务器介绍ssi的使用方法。

如何启动ssi?

在apache服务器下,可以通过直接编辑服务器配置文件或者在需要使用ssi的目录中创建.htaccess文件启动ssi。具体来说,过程如下:

1.服务器配置文件

如果用户具有对服务器配置文件的访问权限,可以通过编辑文件access.conf和srm.conf启动ssi。

首先使用telnet远程登录服务器,找到配置文件的存放目录。一般来说,apache服务器的配置文件都被保存在“/usr/local/etc/httpd/conf”目录下。使用任何一种文字编辑器打开文件srm.conf,找到以下几行:

# if you want to use server side includes, or cgi outside
# scriptaliased directories, uncomment the following lines.
#addtype text/x-server-parsed-html .shtml

#addtype application/x-httpd-cgi .cgi

用户的配置文件中可能没有上述的注释指令行,但是只要找到以addtype开头的两行并且去掉每一行最前面的“#”符号即可。

保存所做的修改,然后再打开文件access.conf。用户需要在文件中找到设置documentroot(根文件)的部分。一般来说该段文本如下,但是不排除<directory>和</directory>标签之间还包含其它设置内容。

# this should be changed to whatever you set documentroot to.
<directory /usr/local/etc/httpd/htdocs>
# this may also be “none”, “all”, or any combination of “indexes”,
# “includes”, or “followsymlinks”
options indexes followsymlinks includes
</directory>

如果用户不希望执行脚本或shell命令,可以在options选项行中加入关键字includesnoexec,这样可以允许ssi,但是不能执行cgi或脚本命令。(注:最新版本的apache服务器只有一个配置文件httpd.conf,以上所提到的内容都已经被包含在该文件中)

2.创建文件.htaccess

如果用户不能直接访问服务器配置文件,可以使用文件编辑器创建一个名为.htaccess的文件。注意,文件名前一定要有符号“.”,这样服务器才能知道该文件是隐藏文件,从而提高文件的安全性,避免错误操作。在.htaccess文件中需要加入以下三行文字:

options indexes followsymlinks includes
addtype application/x-httpd-cgi .cgi
addtype text/x-server-parsed-html .shtml

完成之后可以把.htaccess文件上传到服务端的相应目录,该文件对所有子目录有效。如果用户希望在目录级上禁止cgi或shell命令,可以在.htaccess文件中的options选项行加入关键字includesnoexec。

3.使用.shtml还是.html?

任何包含ssi的文件在下传到客户端之前,都必须经过服务器的解析过程。虽然从某种程度上这样会增加服务器的负载,但是除非用户的网站每天有几百万的访问用户,某则服务器的性能不会有明显的下降。不过,如果不是需要在每个页面都使用ssi的话,确实没有必要让服务器解析每一个页面。如果用户只希望在几个特殊页面中使用ssi,可以将文件的后缀名改为.shtml,这样服务器就可以只解析包含ssi的.shtml文件。另一方面,如果有多个页面使用了ssi,但是用户不希望使用.shtml的后缀名时,可以在.htaccess文件中使用以下命令行:

addtype text/x-server-parsed-html .html

ssi语法

ssi在使用时遵循以下格式:

<!–#directive parameter=”value”–>

其中,directive是向服务器发送的指令名称,parameter是指令的操作对象,而value则是用户希望得到的指令处理结果。
所有的ssi命令都是以“<!–#”开始,其中“<!—”和“#”之间不能有任何空格,否则服务器会把ssi命令当称普通的文件注释处理,不会显示出任何结果,也不会产生错误提示。此外,ssi命令中的“=”两边不能有空格,右边的值必须包含在双引号内,后面可以跟空格,最后是结束标签“–>”。

ssi命令包含六大类指令以及各自的参数,具体如下:

directives
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 webmaster@mydomain.com –>

timefmt:定义日期和时间的使用格式。timefmt参数必须在echo命令之前使用。

<!–#config timefmt=”%a, %b %d, %y”–>

<!–#echo var=”last_modified” –>

显示结果为:

wednesday, april 12, 2000

也许用户对上例中所使用的%a %b %d感到很陌生,下面我们就以表格的形式总结一下ssi中较为常用的一些日期和时间格式。

格式
说明
实例

%%
%

%a
一周七天的缩写形式
thu

%a
一周七天
thursday

%b
月的缩写形式
apr

%b

april

%d
一个月内的第几天
13

%d
mm/dd/yy日期格式
04/13/00

%h
小时(24小时制,从00到23)
01

%i
小时(12小时制,从00到11)
01

%j
一年内的第几天,从01到365
104

%m
一年内的第几个月,从01到12
04

%m
一小时内的第几分钟,从00到59
10

%p
am或pm
am

%r
12小时制的当地时间,格式为%i:%m:%s am | pm
01:10:18 am

%s
一分钟内的第几秒,从00到59
18

%t
24小时制的%h:%m:%s时间格式
01:10:18

%u
一年内的第几个星期,从00到52,以星期天作为每个星期的第一天
15

%w
一星期内的第一天,从0到6
4

%w
一年内的第几个星期,从00到53,以星期一作为每个星期的第一天
15

%y
年的缩写形式,从00到99
00

%y
用四位数字表示一年
2000

%z
时区名称
mdt

sizefmt:决定文件大小是以字节、千字节还是兆字节为单位表示。如果以字节为单位,参数值为“bytes”;对于千字节和兆字节可以使用缩写形式。同样,sizefmt参数必须放在fsize命令的前面才能使用。

<!–#config sizefmt=”bytes” –>

<!–#fsize file=”index.html” –>

2.include命令

include命令可以把其它文档中的文字或图片插入到当前被解析的文档中,是整个ssi的关键所在。通过include命令只需要改动一个文件就可以瞬间更新整个站点!

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一样,只不过返回的是以格林尼治标准时间为基准的日期。例如:

<!–#echo var=”date_gmt” –>

last_modified:显示当前文档的最后更新时间。同样,这是ssi中非常实用的一个功能,只要在html文档中加入以下这行简单的文字,就可以在页面上动态的显示更新时间。

<!–#echo var=”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参数定制输出格式。

<!–#fsize file=”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”>another file</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脚本程序在每个页面放置一个计数器:

<!–#exec cgi=”/cgi-bin/counter.pl” –>