什么是SSI?
SSI是英文Server Side Includes的缩写,翻译成中文就是服务器端包含的意思。从技术角度上说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针。SSI具有 强大的功能,只要使用一条简单的SSI命令就可以实现整个网站的内容更新,时间和日期的动态显示,以及执行shell和CGI脚本程序等复杂的功能。
如何使你的Apache服务器支持SSI?
Apache默认是不支持SSI的,需要我们更改httpd.conf来进行配置。我这里以windows平台的Apache 2.0.x为例,打开conf目录下的httpd.conf文件,搜索“AddType text/html .shtml”,搜索结果:
# AddType text/html .shtml
# AddOutputFilter INCLUDES .shtml
把这两行前面的#去掉。
然后搜索“Options Indexes FollowSymLinks”
在搜索到的那一行后面添加“ Includes”
即将该行改变为 Options Indexes FollowSymLinks Includes 本文来自无涯教程网:http://www.wuyapc.com
保存httpd.conf,重起apache即可。
到此我们就完成了对Apache SSI的设置。
Apache SSI 教程
版本 1.1
本文参照的系统环境:
l Windows XP SP2
l Apache HTTP Server v2.0.55 (Win32)
什么是 SSI?
SSI(Server Side Includes),是嵌套在 HTML 网页中的指示语句,由后台服务器进行代码的解释计算。使用 SSI 可以动态的创建一部分网页内容而不需要编写复杂的 JSP/ASP/PHP 等程序。SSI 是如此的小巧以至于不应算作一门语言,因为他远没有JSP/ASP/PHP 等程序那么复杂,只有一些极其有限的语法规则。但就算是只有这有限的一点语法规则,只要开动起你创新的思维,仍然可以“小才大用”,为你带来效率的提高、体力的节省和脑力的放松 J
很多 HTTP Server 程序都支持 SSI,可能语法稍有不同,比如: IIS/Novell HTTP Server 等等,大同小异,本文要说明的是 Apache 2.0 的 SSI。闲话少说,我想告诉大家的是,这是一篇实践经验总结性的文章,后文中的示例解决方案都是来自实际的网站应用中。其中的一些想法和概念会给你带来提示性的参考或者直接拿为所用。
下图展示了 SSI 被服务器解释,生成最终的纯 HTML 网页后,再发送给访问者浏览的过程:
图 1
系统环境安装
这不是一篇教你如何配置 Apache 的文章,但为了在你在本地系统环境测试的方便,还是简单的说明一下。
首先可以到 http://www.apache.org/ 网站去下载一份最新的 Apache 安装文件,安装之后是否要做其他设置请自行参考相关资料,这里只说明如何开启 SSI 支持的步骤。
我在本地创建了一个 bnn 的文件夹,设成虚拟目录,然后就可以通过浏览器访问:http://localhost/bnn/
打开 Apache 的配置文件,例如:C:/Program Files/Apache Group/Apache2/conf/httpd.conf
然后加入类似下面的这段代码(主要是中间的三行):黑体字部分是文件夹路径。
<Directory "D:/Works/Jan-Boy/bnn"> AddType text/html .ssi Options Includes AddOutputFilterByType INCLUDES;DEFLATE text/html </Directory> |
OK,“Restart”Apache Server (如果右下角系统栏中有 apache 小图标,则左键点击选择 Restart; 也可以在“开始 -> 程序”菜单的 Apache 项下面找到 Restart 命令; 还可以直接在安装目录运行C:/Program Files/Apache Group/Apache2/bin /ApacheMonitor.exe 后点击 Restart 按钮)。
测试 SSI 是否已经打开,在 bnn 文件夹下面新建一个 index.html 文件,打开后在里面写上:
<!--#e cho var="DATE_LOCAL" --> |
保存关闭,然后打开浏览器测试:http://localhost/bnn/
如果正确的显示出类似“Wednesday, 01-Mar-2006 02:03:06 China Standard Time”这样的文字就表示 SSI 开启成功!
“呼~~”深呼一口气,搞掂,收工!
开始 SSI
参考资源
在正式开始之前,先介绍两个官方参考文档:
Apache Tutorial: Introduction to Server Side Includes
http://httpd.apache.org/docs/2.0/howto/ssi.html
Apache Module mod_include
http://httpd.apache.org/docs/2.0/mod/mod_include.html
这些文档在 Apache 的安装文件夹中可以找到,然后通过 HTTP 进行访问,并提供多国语言版本,不过没有中文(已经习惯了,谁让CN常常是被忽视的小弱国呢~,不过似乎网上流传了英雄好汉们翻译过的部分内容)。在官方网站上可以找到最新版的文档(包括更新测试版的文档):http://httpd.apache.org/docs-project/
SSI 语法
SSI 指令的语法格式:
<!--#element attribute=value attribute=value ... --> |
举几个实际例子:
http://<!--#e cho var=”SERVER_NAME” var=”DOCUMENT_URI” --> <!--#i nclude virtual=”ssi/footer.ssi” -->
<!--#set var=”Protocol” value=”http” --> |
SSI 语句是直接嵌套在 HTML 页面中的,可以放置在任意的位置。所以 SSI 语句前后采用 HTML 注释的写法,这样一旦服务器关闭了对 SSI 的支持,此时访问页面的话,也不会直接在网页上显示出不必要的代码。
参见语法格式图示:
图 2
注意:
1. 在结尾符号“-->”的前面需要有一个空格,是不能丢掉的,曾经在一个复杂的页面中遇到一个问题是因为没有加上那个空格引起的,因为很多时候容易忽略到这个小问题,而往往最难纠错的就是这些小问题引起。
2. SSI 不区分大小写,包括元素名称、变量名称,大写和小写都是允许的。
良好的书写格式可以帮助你更好的调试代码,清晰易查找,特别是在写非常复杂的 SSI 的时候,因为没有软件工具可以自动对 SSI 语句进行排版(因为大多数工具会把 SSI 语句当作普通的 HTML 注释处理,Dreamweaver 只能识别 include 元素的 SSI 指令语句),所以就需要在书写的时候自己整理代码,养成良好习惯,注意大小写和上下文的缩进关系等。
书写格式的约定(推荐格式,并非强制):
l 元素和属性使用小写字母;
l 环境变量都使用大写字母;
l 合理的缩进,在使用 if 语句嵌套的时候推荐使用 1 tab(占 4 space) 缩进,以变更清晰的显示层次关系。
SSI 使用
对于 SSI 具体的使用是否有些不清楚呢?下面列出一份完整的示例代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"> <!--#i nclude virtual="/bnn/ssi/header.ssi"-->
<div id="Main"> |
说明:
1. SSI 可以插入在网页的任意地方;
2. 属性值要合理使用双引号和单引号,例如“<!--#e cho var='SERVER_NAME' -->”这个位置,大多数情况下, SERVER_NAME 使用双引号不会出现问题,但在一些复杂的网页里面仍然会造成歧义,Apache 无法识别正确的引号配对匹配。
变量和数据类型
SSI 中的变量分为自定义变量和环境变量。
自定义变量使用 set 命令来创建:
<!--#set var=”Protocol” value=”http” --> |
说明:var 属性值就是变量名称;value 的属性值就是变量值。上面的语句表示,创建了一个 “Protocol”的变量,变量所代表的值是 “http”。
环境变量是系统已经存在的一些默认的变量和变量值,可以直接使用。例如:
<!--#e cho var=”DATE_LOCAL” --> |
说明: DATE_LOCAL 就是一个环境变量,用来显示当前本地时间。类似的环境变量还有很多,比如常用HTTP_HOST、SERVER_NAME、DOCUMENT_URI、DOCUMENT_NAME 等等。
想知道到底有多少个可以用的环境变量么?很简单的方法:
<!--#printenv --> |
说明:printenv 命令就是这个作用,将所有的环境变量和变量当前值列表出来。我们把上面的一行代码放入到任意一个页面中,然后通过浏览器访问这个页面:
图 3
看到的很乱页面,查看源代码吧:
哦,原来是一个纯文本格式的,每行第一个等号前面的是环境变量名称,后面就是他所代表的字符串值。
HTTP_ACCEPT=*/* HTTP_ACCEPT_LANGUAGE=en-us,zh-cn;q=0.5 HTTP_USER_AGENT=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 1.1.4322) HTTP_HOST=localhost HTTP_CONNECTION=Keep-Alive HTTP_COOKIE=dbx-postmeta=grabit=2+,5+,6-,1-,4-,3-,0-&advancedstuff=0-,1-,2- PATH=C:/Program Files/ThinkPad/Utilities;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;C:/Program Files/IBM/Infoprint Select;C:/Program Files/ATI Technologies/ATI Control Panel;C:/Program Files/QuickTime/QTSystem/;C:/Program Files/ThinkPad/ConnectUtilities SystemRoot=C:/WINDOWS COMSPEC=C:/WINDOWS/system32/cmd.exe PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH WINDIR=C:/WINDOWS SERVER_SIGNATURE=<address>Apache/2.0.55 (Win32) PHP/5.1.1 Server at localhost Port 80</address> SERVER_SOFTWARE=Apache/2.0.55 (Win32) PHP/5.1.1 SERVER_NAME=localhost SERVER_ADDR=127.0.0.1 SERVER_PORT=80 REMOTE_ADDR=127.0.0.1 DOCUMENT_ROOT=D:/Works/Jan-Boy SERVER_ADMIN=admin@boynannan.com SCRIPT_FILENAME=D:/Works/Jan-Boy/bnn/printenv.html REMOTE_PORT=2529 GATEWAY_INTERFACE=CGI/1.1 SERVER_PROTOCOL=HTTP/1.0 REQUEST_METHOD=GET QUERY_STRING= REQUEST_URI=/bnn/printenv.html SCRIPT_NAME=/bnn/printenv.html DATE_LOCAL=Thursday, 02-Mar-2006 11:15:45 China Standard Time DATE_GMT=Thursday, 02-Mar-2006 03:15:45 GMT LAST_MODIFIED=Wednesday, 01-Mar-2006 10:02:13 China Standard Time DOCUMENT_URI=/bnn/printenv.html USER_NAME=<unknown> DOCUMENT_NAME=printenv.html |
数据类型:SSI 中只有一种数据类型“字符串”。例如:
<!--#set var=”MyFirstVar” value=”120” --> <!--#set var=”MySecondVar” value=”20” --> |