服务器端内嵌
服务器端内嵌(Server Side Includes,亦简称为SSI)是一种大多数仅应用于互联网上的简单解释性服务器端脚本语言。
SSI最常见的用法是将一个或多个文件的内容包含在网页服务器的页面上。例如,一张包含每日报价的页面可以通过下面一段代码将报价单包含在页面中:
<!--#include virtual="../quote.txt" -->
若更改quote.txt
文件,则所有包含此文件的页面都会展示最新的每日报价。这个包含不止局限于文件,而且还有来自程序的文本输出,或者是如当前时间的系统变量。
服务器端内嵌常用于在整个站点中包含一段公共代码,例如页眉、页脚与导航栏。使用控制代码可以有条件地将导航栏包含在内。
为了让网页服务器辨识启用了服务器端内嵌的HTML文件,从而运行这段代码。则文件名应有特殊的扩展名,默认为.shtml
、 .stm
和.shtm
;或者服务器设置文件的执行标记以配置为允许服务器端内嵌。[1]
作为一种简单的编程语言,服务器端内嵌仅支持一种数据类型:纯文本。它的控制流程相当简单,支持选择,但循环不被原生支持,且只可以通过包含递归式或URL重定向的方式进行。这种简单设计的语言使得其比大多数服务器端脚本语言都更易于上手学习使用,而复杂的服务器端处理过程通常使用功能更丰富的编程语言之一来完成。服务器端内嵌拥有圖靈完備性。[2]
Apache、LiteSpeed、nginx、lighttpd与IIS五大主流网页服务器软件均支持此种语言。
SSI的语法相当简单:<!--#directive parameter=value parameter=value -->
。这些指令都放在HTML注释区,所以若SSI功能并未启用时,除非其预览页面源代码,否则用户将不会在页面上看到这些SSI指令。请注意这种语言的语法中不允许在开头的"<"和指令之间存在空格。
[3]
指令
最常用的指令集
指令 | 参数 | 描述 | 举例 |
---|---|---|---|
include | file或virtual | 此指令可能是最常用的SSI指令,允许其中一个文档中的内容被包含在另外一个文档内。file或virtual参数指定被包含的文件(HTML页面、文本文件、脚本等)。包含了其他文件中的内容或是运行CGI脚本的结果。若进程没有权限阅读文件或执行脚本,文件包含将会失败。“virtual”参数指定相对于域根的目标,而“file”参数则指定相对于当前文件目录的路径。当使用“file”参数时,禁止引用绝对路径。除非被明确配置,对更高级目录(..)的访问通常是被禁止的。Apache文档相对“file”参数更推荐使用“virtual”参数。 | <!--#include virtual="menu.cgi" --> 或 <!--#include file="footer.html" -->
Apache的SSI教程规定格式为在闭合元素的“-->”之前留出空格。 |
exec | cgi或cmd | 此指令运行服务器上的程序、脚本亦或是Shell命令。“cmd”参数特指服务端的命令;“cgi”参数特指CGI脚本的路径。当前SSI脚本的PATH_INFO和QUERY_STRING均会传递到CGI脚本中,结果应运行“exec cgi”而非“include virtual”。 | <!--#exec cgi="/cgi-bin/foo.cgi" --> 或 <!--#exec cmd="ls -l" --> |
echo | var | 此指令将显示特定HTTP环境变量的内容。这些变量包括HTTP_USER_AGENT、LAST_MODIFIED和HTTP_ACCEPT。 | <!--#echo var="REMOTE_ADDR" --> |
config | timefmt、sizefmt或errmsg | 此指令配置日期、时间、文件大小和错误信息(SSI命令执行失败的时候反馈)的显示格式。 | <!--#config timefmt="%y %m %d" --> 或 <!--#config sizefmt="bytes" --> 或 <!--#config errmsg="SSI命令运行失败!" --> |
flastmod或fsize | file或virtual | 这些指令显示特定文档最近一次被修改的时间,或者是特定文档的大小。“file”或“virtual”参数指明所使用的文档。“file”参数将文档定义为相对于文档路径;“virtual”参数将文档定义为相对于文档根目录。 | <!--#flastmod virtual="index.html" --> 或 <!--#fsize file="script.pl" --> |
printenv | 此指令输出所有的变量和它们的值,这些变量包含环境变量和用户定义变量。它没有任何属性。 | <!--#printenv --> |
控制指令
指令 | 参数 | 描述 | 举例 |
---|---|---|---|
if | expr | 用于进行一个物理页面可能会生成的多个逻辑页面的条件测试。 | <!--#if expr="${Sec_Nav}" --> <!--#include virtual="" --> <!--#endif --> |
elif | expr | 与编程语言中的进一步条件测试具有相同用途。 | <!--#if expr="${Sec_Nav}" --> <!--#include virtual="secondary_nav.txt" --> <!--#elif expr="${Pri_Nav}" --> <!--#include virtual="primary_nav.txt" --> <!--#endif --> |
else | 如果没有if和elif指令捕捉到现在的情况,这里的事情就会发生。 | <!--#if expr="${Sec_Nav}" --> <!--#include virtual="secondary_nav.txt" --> <!--#else --> <!--#include virtual="article.txt" --> <!--#endif --> | |
endif | 参见上方例子。 | ||
set | var、value | 设定SSI变量的值。(虽然同时出现在Apache httpd和lighttpd中,但不是所有的软件都支持此指令。) | <!--#set var="foo" value="bar" --> |
另请参阅
- 页面片段缓存
- 嵌入 (網路)