一:概述
SSI:服務器端嵌入或者叫服務器端包含,是Server Side Include的簡寫。SSI技術通過在文檔中加入SSI指令,讓服務器端在輸出文檔之前解析SSI指令,並把解析完的結果和文檔一同輸出給客戶端。
SSI的指令格式為:<!-- #directive parameter="value" -->
其中,directive是指令名,parameter指令參數,value指令參數值
可以看到,就是html注釋,事實上,Web服務器開啟了SSI,並且頁面包含可以解析的指令,那么Web服務器就解析這個指令。沒開啟器SSI或者開啟了SSI,但是不是可以解析的指令,那么都當做注釋。
注意的是,“#”要和directive連在一起,中間不能含有空格
SSI包含的指令有
config:修改 SSI 的默認設置
echo:顯示環境變量
exec:執行 CGI 腳本
flastmod :顯示指定文件的最后修改日期
fsize:顯示指定文件的大小
include:把其它文檔插入到當前被解析的文檔中
二:准備工作
新建一個站點,站點路徑為C:\inetpub\wwwroot\ssitutorial,網站名稱為localhost8585,端口為8585
在站點目錄放一個html文件,名為index.html,首先沒開啟SSI時,測試使用SSI指令是否有效果
html文件內容如下
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <p>Date = <!--#echo var = "date_local" --></p> </body> </html>
使用了echo指令,顯示當前時間
瀏覽http://localhost:8585/index.html,查看效果
可以看到”Date=“后面並沒顯示當前時間,說明沒開啟SSI,指令只是作為注釋
下面,開啟SSI
在IIS選中站點localhost8585,選擇”處理程序映射“
進入”處理程序映射“后,選擇操作中的”添加模塊映射“
彈出”添加模塊映射“窗口,在窗口指定解析html文件
點確定后,可以看到,在”處理程序映射“多了一項,同時,在站點目錄下,也就是C:\inetpub\wwwroot\ssitutorial生成了一個web.config文件
”處理程序映射“
web.config文件
web.config的內容如下
設置后之后,測試下SSI是否成功,刷新http://localhost:8585/index.html,查看效果
可以看到,”Date=”后面顯示日期,說明SSI指令生效了
三:SSI各個指令的用法
3.1 config:修改 SSI 的默認設置,參數:
errmsg:自定義的SSI執行錯誤信息;
timefmt:定義日期和時間的格式;
sizefmt:決定文件大小是以字節、千字節為單位表示
errmsg參數:自定義的SSI執行錯誤信息,必須放在其它指令前,才能顯示自定義的錯誤信息
例如:
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <!-- #config errmsg="這是自定義錯誤信息"--> <p>File Size = <!--#fsize file="filename.txt"--> bytes</p> </body> </html>
這里的filename.txt並不存在,所以執行會出錯,那么就顯示自定義錯誤信息了,如下圖
timefmt參數:定義日期和時間的格式
<!-- #config timefmt="%y年%m月%d日"--> <p>Date = <!--#echo var = "date_local" --></p>
sizefmt:決定文件大小是以字節(bytes)、千字節(abbrev)為單位表示
比如,有一個文件a.exe,大小為48,594,944字節,使用不同單位
<!--#config sizefmt="bytes"--> <p><!--#fsize file="a.exe"--> bytes</p> <!--#config sizefmt="abbrev"--> <p><!--#fsize file="a.exe"--> kb</p>
顯示如下
算一下,結果是正確的
3.2 echo:顯示環境變量
<p>請求方式= <!-- #echo var = "HTTP_METHOD" --></p>
這里顯示請求方式
完整的環境變量,可以在點這里查詢
3.3 exec:執行 CGI 腳本
首先需要得到CGI程序,用控制台做一個CGI程序,名為CgiDemo
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace CgiDemo { class Program { static void Main(string[] args) { Console.Write("Content-Type: text/html\n\n"); Console.Write("<p>Path:" +System.Environment.GetEnvironmentVariable("PATH_TRANSLATED") +"</p>"); } // End of Main(). } }
輸出CGI程序的服務器路徑
然后,使用exec執行CGI
<pre><!--#exec cgi = "/cgi-bin/cgidemo.exe" --></pre>
接着訪問上面html的地址http://localhost:8585/index.html,出現下面這種情況
說明服務器還要做一些配置。首先,在站點localhost8585—>處理程序映射—>添加模塊映射
配置CGI模塊
再然后,在 服務器 (不是站點)下找到”ISAPI和CGI限制”
添加剛才那個CGI
再次訪問http://localhost:8585/index.html,得到如下結果
說明成功執行CGI程序
3.4 flastmod :顯示指定文件的最后修改日期
<!-- #config timefmt="%y年%m月%d日"--> <pre> <!-- #flastmod file = "a.exe" --></pre>
得到如下結果
a.exe的信息如下
說明是正確的
3.5 fsize:顯示指定文件的大小
<!--#config sizefmt="bytes"--> <p><!--#fsize file="a.exe"--> bytes</p>
得到如下結果
a.exe大小信息如下
說明也是正確的
3.6 include:把其它文檔插入到當前被解析的文檔中
在index.html所在目錄建一個inc.htm文件,文件內容如下
<h2>這是include文件內容</h2>
在index.html包含inc.html
<body> <!--#include file="inc.htm"--> </body>
訪問http://localhost:8585/index.html,得到如下結果
可見,inc.htm里的內容被包含進來
另外,如果被包含文件中含有SSI指令,也會解析SSI指令