您是否曾或正在為如何能夠在最短的時(shí)間內(nèi)完成對(duì)一個(gè)包含上千個(gè)頁(yè)面的網(wǎng)站的修改而苦惱?那么能夠看一下本文的介紹,或許能夠?qū)δ兴鶐椭?/p>
什么是ssi?
ssi是英文server side includes的縮寫,翻譯成中文就是服務(wù)器端包含的意思。從技術(shù)角度上說(shuō),ssi就是html文檔中,能夠通過(guò)注釋行調(diào)用的命令或指針。ssi 具備強(qiáng)大的功能,只要使用一條簡(jiǎn)單的ssi 命令就能夠?qū)崿F(xiàn)整個(gè)網(wǎng)站的內(nèi)容更新,動(dòng)態(tài)顯示時(shí)間和日期,連同執(zhí)行shell和cgi腳本程式等復(fù)雜的功能。ssi 能夠稱得上是那些資金短缺、時(shí)間緊張、工作量大的網(wǎng)站研發(fā)人員的最好幫手。
ssi最初在ncsa服務(wù)器平臺(tái)上推出,在apache服務(wù)器中得到擴(kuò)展和加強(qiáng),現(xiàn)在已能夠在幾乎任何的服務(wù)器上運(yùn)行。本文將主要結(jié)合apache服務(wù)器介紹ssi的使用方法。
如何啟動(dòng)ssi?
在apache服務(wù)器下,能夠通過(guò)直接編輯服務(wù)器配置文檔或在需要使用ssi的目錄中創(chuàng)建.htaccess文檔啟動(dòng)ssi。具體來(lái)說(shuō),過(guò)程如下:
1.服務(wù)器配置文檔
假如用戶具備對(duì)服務(wù)器配置文檔的訪問(wèn)權(quán)限,能夠通過(guò)編輯文檔access.conf和srm.conf啟動(dòng)ssi。
首先使用telnet遠(yuǎn)程登錄服務(wù)器,找到配置文檔的存放目錄。一般來(lái)說(shuō),apache服務(wù)器的配置文檔都被保存在"/usr/local/etc/httpd/conf"目錄下。使用任何一種文字編輯器打開(kāi)文檔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
用戶的配置文檔中可能沒(méi)有上述的注釋指令行,但是只要找到以addtype開(kāi)頭的兩行并且去掉每一行最前面的"#"符號(hào)即可。
保存所做的修改,然后再打開(kāi)文檔access.conf。用戶需要在文檔中找到配置documentroot(根文檔)的部分。一般來(lái)說(shuō)該段文本如下,但是不排除<directory>和</directory>標(biāo)簽之間還包含其他配置內(nèi)容。
# 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>
假如用戶不希望執(zhí)行腳本或shell命令,能夠在options選項(xiàng)行中加入關(guān)鍵字includesnoexec,這樣能夠允許ssi,但是不能執(zhí)行cgi或腳本命令。(注:最新版本的apache服務(wù)器只有一個(gè)配置文檔httpd.conf,以上所提到的內(nèi)容都已被包含在該文檔中)
2.創(chuàng)建文檔.htaccess
假如用戶不能直接訪問(wèn)服務(wù)器配置文檔,能夠使用文檔編輯器創(chuàng)建一個(gè)名為.htaccess的文檔。注意,文檔名前一定要有符號(hào)".",這樣服務(wù)器才能知道該文檔是隱藏文檔,從而提高文檔的安全性,避免錯(cuò)誤操作。在.htaccess文檔中需要加入以下三行文字:
options indexes followsymlinks includes
addtype application/x-httpd-cgi .cgi
addtype text/x-server-parsed-html .shtml
完成之后能夠把.htaccess文檔上傳到服務(wù)端的相應(yīng)目錄,該文檔對(duì)任何子目錄有效。假如用戶希望在目錄級(jí)上禁止cgi或shell命令,能夠在.htaccess文檔中的options選項(xiàng)行加入關(guān)鍵字includesnoexec。
3.使用.shtml還是.html?
任何包含ssi的文檔在下傳到客戶端之前,都必須經(jīng)過(guò)服務(wù)器的解析過(guò)程。雖然從某種程度上這樣會(huì)增加服務(wù)器的負(fù)載,但是除非用戶的網(wǎng)站每天有幾百萬(wàn)的訪問(wèn)用戶,某則服務(wù)器的性能不會(huì)有明顯的下降。但是,假如不是需要在每個(gè)頁(yè)面都使用ssi的話,確實(shí)沒(méi)有必要讓服務(wù)器解析每一個(gè)頁(yè)面。假如用戶只希望在幾個(gè)特別頁(yè)面中使用ssi,能夠?qū)⑽臋n的后綴名改為.shtml,這樣服務(wù)器就能夠只解析包含ssi的.shtml文檔。另一方面,假如有多個(gè)頁(yè)面使用了ssi,但是用戶不希望使用.shtml的后綴名時(shí),能夠在.htaccess文檔中使用以下命令行:
addtype text/x-server-parsed-html .html
ssi語(yǔ)法
ssi在使用時(shí)遵循以下格式:
<!--#directive parameter="value"-->
其中,directive是向服務(wù)器發(fā)送的指令名稱,parameter是指令的操作對(duì)象,而value則是用戶希望得到的指令處理結(jié)果。
任何的ssi命令都是以"<!--#"開(kāi)始,其中"<!—"和"#"之間不能有任何空格,否則服務(wù)器會(huì)把ssi命令當(dāng)稱普通的文檔注釋處理,不會(huì)顯示出任何結(jié)果,也不會(huì)產(chǎn)生錯(cuò)誤提示。此外,ssi命令中的"="兩邊不能有空格,右邊的值必須包含在雙引號(hào)內(nèi),后面能夠跟空格,最后是結(jié)束標(biāo)簽"-->"。
ssi命令包含六大類指令連同各自的參數(shù),具體如下:
directives
parameters
config
errmsg, timefmt, sizefmt
include
virtual, file
echo
var
fsize
file
flastmod
file
exec
cmd, cgi
下面我們將逐一進(jìn)行介紹。
1.config命令
config命令主要用于修改ssi的默認(rèn)配置。其中:
errmsg:配置默認(rèn)錯(cuò)誤信息。為了能夠正常的返回用戶設(shè)定的錯(cuò)誤信息,在html文檔中errmsg參數(shù)必須被放置在其他ssi命令的前面,否則客戶端只能顯示默認(rèn)的錯(cuò)誤信息,而不是由用戶設(shè)定的自定義信息。
<!--#config errmsg="error! please email [email protected] -->
timefmt:定義日期和時(shí)間的使用格式。timefmt參數(shù)必須在echo命令之前使用。
<!--#config timefmt="%a, %b %d, %y"-->
<!--#echo var="last_modified" -->
顯示結(jié)果為:
wednesday, april 12, 2000
也許用戶對(duì)上例中所使用的%a %b %d感到很陌生,下面我們就以表格的形式總結(jié)一下ssi中較為常用的一些日期和時(shí)間格式。
格式
說(shuō)明
實(shí)例
%%
%
%a
一周七天的縮寫形式
thu
%a
一周七天
thursday
%b
月的縮寫形式
apr
%b
月
april
%d
一個(gè)月內(nèi)的第幾天
13
%d
mm/dd/yy日期格式
04/13/00
%h
小時(shí)(24小時(shí)制,從00到23)
01
%i
小時(shí)(12小時(shí)制,從00到11)
01
%j
一年內(nèi)的第幾天,從01到365
104
%m
一年內(nèi)的第幾個(gè)月,從01到12
04
%m
一小時(shí)內(nèi)的第幾分鐘,從00到59
10
%p
am或pm
am
%r
12小時(shí)制的當(dāng)?shù)貢r(shí)間,格式為%i:%m:%s am | pm
01:10:18 am
%s
一分鐘內(nèi)的第幾秒,從00到59
18
%t
24小時(shí)制的%h:%m:%s時(shí)間格式
01:10:18
%u
一年內(nèi)的第幾個(gè)星期,從00到52,以星期天作為每個(gè)星期的第一天
15
%w
一星期內(nèi)的第一天,從0到6
4
%w
一年內(nèi)的第幾個(gè)星期,從00到53,以星期一作為每個(gè)星期的第一天
15
%y
年的縮寫形式,從00到99
00
%y
用四位數(shù)字表示一年
2000
%z
時(shí)區(qū)名稱
mdt
sizefmt:決定文檔大小是以字節(jié)、千字節(jié)還是兆字節(jié)為單位表示。假如以字節(jié)為單位,參數(shù)值為"bytes";對(duì)于千字節(jié)和兆字節(jié)能夠使用縮寫形式。同樣,sizefmt參數(shù)必須放在fsize命令的前面才能使用。
<!--#config sizefmt="bytes" -->
<!--#fsize file="index.html" -->
2.include命令
include命令能夠把其他文檔中的文字或圖片插入到當(dāng)前被解析的文檔中,是整個(gè)ssi的關(guān)鍵所在。通過(guò)include命令只需要改變一個(gè)文檔就能夠瞬間更新整個(gè)站點(diǎn)!
include命令具備兩個(gè)不同的參數(shù),假如使用錯(cuò)誤的參數(shù)更新站點(diǎn)的話,不但達(dá)不到初衷,反而會(huì)得到一大堆的錯(cuò)誤信息。
virtual:給出到服務(wù)器端某個(gè)文檔的虛擬路徑。例如:
<!--#include virtual="/includes/header.html" -->
為了更加合理的組織站點(diǎn)的內(nèi)容,用戶能夠在根目錄下創(chuàng)建includes子目錄來(lái)存放任何的包含文檔。virtual參數(shù)能夠通知服務(wù)器所要包含的是個(gè)虛擬文檔,即文檔和當(dāng)前被解析的文檔不是位于同一個(gè)目錄,而是存放在其他目錄中。服務(wù)器會(huì)根據(jù)該參數(shù)的值找到根目錄下的includes子目錄。使用這種方法,用戶能夠把任何html文檔包含的文檔放在一個(gè)目錄中,而根據(jù)相互之間的關(guān)系把不同的頁(yè)面保存在不同的目錄或子目錄中。無(wú)論服務(wù)器解析哪一個(gè)文檔都能夠找到所包含的文檔,不會(huì)產(chǎn)生任何錯(cuò)誤。
但是這里有一個(gè)小問(wèn)題需要解決。一般我們都會(huì)在頁(yè)面中加入一些title和meta標(biāo)簽,假如我們規(guī)定任何的頁(yè)面都調(diào)用相同的頁(yè)眉文檔的話,就顯得很不靈活。用戶碰到這樣的問(wèn)題時(shí),能夠使用兩個(gè)包含文檔,一個(gè)配置title標(biāo)簽前的內(nèi)容,另一個(gè)配置meta標(biāo)簽后的部分,而在兩個(gè)包含文檔之間則能夠添加任何定制內(nèi)容。例如:
<!--#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" -->
這里放置頁(yè)面內(nèi)容
<!--#include virtual="/includes/footer.html" -->
從上我們能夠看出通過(guò)在頁(yè)面中包含頁(yè)眉和頁(yè)腳能夠大大減少站點(diǎn)更新的工作量。但是假如我們希望動(dòng)態(tài)顯示一些內(nèi)容,例如頁(yè)面的最后更新時(shí)間等該怎么辦呢?沒(méi)問(wèn)題,我們能夠把包含文檔使用.html后綴保存,這樣就能夠在包含文檔中調(diào)用其他的包含文檔。
file:給出到當(dāng)前目錄的相對(duì)路徑,其中不能使用"../",也不能使用絕對(duì)路徑。例如:
<!--#include file="header.html" -->
這就需要每一個(gè)目錄中都包含一個(gè)header.html文檔。當(dāng)然,采用這樣的方法并不比更新每一個(gè)頁(yè)面簡(jiǎn)單多少,但是假如用戶只更新一、兩個(gè)文檔的話還是很方便的。例如,假如我們不希望讓一個(gè)對(duì)html不熟悉的人直接改變網(wǎng)站中的新聞頁(yè)面的話,能夠只讓他更新一個(gè)單獨(dú)的文本文檔,然后再把該文檔包含到hmtl文檔中,這樣即不會(huì)破壞原頁(yè)面,同時(shí)又更新了內(nèi)容,兩全其美。
3.echo:
echo命令能夠顯示以下各環(huán)境變量:
document_name:顯示當(dāng)前文檔的名稱。
<!--#echo var="document_name" -->
顯示結(jié)果為:
index.html
document_uri:顯示當(dāng)前文檔的虛擬路徑。例如:
<!--#echo var="document_uri" -->
顯示結(jié)果為:
/yourdirectory/yourfilename.html
隨著網(wǎng)站的不斷發(fā)展,那些越來(lái)越長(zhǎng)的url地址肯定會(huì)讓人頭疼。假如使用ssi,一切就會(huì)迎刃而解。因?yàn)槲覀兡軌虬丫W(wǎng)站的域名和ssi命令結(jié)合在一起顯示完整的url,即:
http://yourdomain<!--#echo var="document_uri" -->
query_string_unescaped:顯示未經(jīng)轉(zhuǎn)義處理的由客戶端發(fā)送的查詢字串,其中任何的特別字符前面都有轉(zhuǎn)義符"/"。例如:
<!--#echo var="query_string_unescaped" -->
date_local:顯示服務(wù)器設(shè)定時(shí)區(qū)的日期和時(shí)間。用戶能夠結(jié)合config命令的timefmt參數(shù),定制輸出信息。例如:
<!--#config timefmt="%a, the %d of %b, in the year %y" -->
<!--#echo var="date_local" -->
顯示結(jié)果為:
saturday, the 15 of april, in the year 2000
date_gmt:功能和date_local相同,只但是返回的是以格林尼治標(biāo)準(zhǔn)時(shí)間為基準(zhǔn)的日期。例如:
<!--#echo var="date_gmt" -->
last_modified:顯示當(dāng)前文檔的最后更新時(shí)間。同樣,這是ssi中很實(shí)用的一個(gè)功能,只要在html文檔中加入以下這行簡(jiǎn)單的文字,就能夠在頁(yè)面上動(dòng)態(tài)的顯示更新時(shí)間。
<!--#echo var="last_modified" -->
cgi環(huán)境變量
除了ssi環(huán)境變量之外,echo命令還能夠顯示以下cgi環(huán)境變量:
server_software:顯示服務(wù)器軟件的名稱和版本。例如:
<!--#echo var="server_software" -->
server_name: 顯示服務(wù)器的主機(jī)名稱,dns別名或ip地址。例如:
<!--#echo var="server_name" -->
server_protocol:顯示客戶端請(qǐng)求所使用的協(xié)議名稱和版本,如http/1.0。例如:
<!--#echo var="server_protocol" -->
server_port:顯示服務(wù)器的響應(yīng)端口。例如:
<!--#echo var="server_port" -->
request_method:顯示客戶端的文檔請(qǐng)求方法,包括get, head, 和post。例如:
<!--#echo var="request_method" -->
remote_host:顯示發(fā)出請(qǐng)求信息的客戶端主機(jī)名稱。
<!--#echo var="remote_host" -->
remote_addr:顯示發(fā)出請(qǐng)求信息的客戶端ip地址。
<!--#echo var="remote_addr" -->
auth_type:顯示用戶身份的驗(yàn)證方法。
<!--#echo var="auth_type" -->
remote_user:顯示訪問(wèn)受保護(hù)頁(yè)面的用戶所使用的帳號(hào)名稱。
<!--#echo var="remote_user" -->
4.fsize:顯示指定文檔的大小,能夠結(jié)合config命令的sizefmt參數(shù)定制輸出格式。
<!--#fsize file="index_working.html" -->
5.flastmod:顯示指定文檔的最后修改日期,能夠結(jié)合config 命令的timefmt參數(shù)控制輸出格式。
<!--#config timefmt="%a, the %d of %b, in the year %y" -->
<!--#flastmod file="file.html" -->
這里,我們能夠利用flastmod參數(shù)顯示出一個(gè)頁(yè)面上任何鏈接頁(yè)面的更新日期。方法如下:
<!--#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" -->
顯示結(jié)果為:
file april 19, 2000
another file january 08, 2000
也許有的讀者會(huì)認(rèn)為兩個(gè)鏈接就這么復(fù)雜,一點(diǎn)也不方便。其實(shí),假如頁(yè)面上有20個(gè)或更多的鏈接,而且每個(gè)鏈接都定期更新的話,就能夠看出使用flastmod顯示修改日期的作用。
6.exec
exec命令能夠執(zhí)行cgi腳本或shell命令。使用方法如下:
cmd:使用/bin/sh執(zhí)行指定的字串。假如ssi使用了includesnoexec選項(xiàng),則該命令將被屏蔽。
cgi:能夠用來(lái)執(zhí)行cgi腳本。例如,下面這個(gè)例子中使用服務(wù)端cgi-bin目錄下的counter.pl腳本程式在每個(gè)頁(yè)面放置一個(gè)計(jì)數(shù)器:
<!--#exec cgi="/cgi-bin/counter.pl" -->
新聞熱點(diǎn)
疑難解答