转: Apache SSI详解及应用

转: Apache SSI详解及应用

什么是 SSI?

SSI(Server Side Includes),是嵌套在 HTML 网页中的指示语句,由后台服务器进行代码的解释计算。使用 SSI 可以动态的创建一部分网页内容而不需要编写复杂的 JSP/ASP/PHP 等程序。SSI 是如此的小巧以至于不应算作一门语言,因为他远没有JSP/ASP/PHP 等程序那么复杂,只有一些极其有限的语法规则。

很多 HTTP Server 程序都支持 SSI,可能语法稍有不同,比如: IIS/Novell HTTP Server 等等,大同小异,本文要说明的是 Apache 2.0 的 SSI。闲话少说,我想告诉大家的是,这是一篇实践经验总结性的文章,后文中的示例解决方案都是来自实际的网站应用中。

开启SSI功能需先对apache配置文件(httpd.conf)进行设置 详情请百度

<Directory "D:/myProject/web">
AddType text/html .ssi #这里可以是 .shtml 或其他 不一定要 .ssi, 设置.ssi后缀的也是text/html类型的文件
Options Includes
AddOutputFilterByType INCLUDES; DEFLATE text/html #输出处理器

测试SSI是否成功启用 编辑文件

// test.ssi :
# echo指令输出变量 DATE_LOCAL

## 特别注意 <!--# 之间不能有任何空格,不然指令是无效的,被当作html注释

**因为很多IDE都有注释代码行的快捷键, 如 sublime text( ctrl + /) 但是会变成 <!-- #echo var="..." -->,由于多了个空格,所以ssi指令被当成注释了。 **

浏览器访问 http://localhost/test.ssi 能看到打印当前时间 说明SSI已启用


关于SSI的更多参考资料

这些文档也可以在 Apache的安装文件夹找到:
Apache Tutorial: Introduction to Server Side Includes
Apache mod_include

SSI语法:

<!--#fn attribute=value attribute=value ... --> fn可以理解成函数或者指令。 例子:

环境变量习惯大写

http://

virtual的值可以是相对路径或绝对路径 如 virtual="/ssi/footer.ssi"

file的值只能是相对路径

设置自定义变量

SSI 语句是直接嵌套在 HTML 页面中的,可以放置在任意的位置。所以 SSI 语句前后采用 HTML 注释的写法,这样一旦服务器关闭了对 SSI 的支持,此时访问页面的话,也不会直接在网页上显示出不必要的代码。

SSI不区分大小写,环境变量用大写是很好的习惯;
SSI中只有一种数据类型:字符串;
SSI中的转义符是 \ ,字符串可以用双引号或单引号包裹 ,同JS

SSI 中的变量分为自定义变量和环境变量**

自定义变量使用 set 命令来创建:<!--#set var="protocol" value="http" -->
环境变量是系统已经存在的一些默认的变量和变量值,可以直接使用。 <!--#echo var=”DATE_LOCAL” -->
DATE_LOCAL 就是一个环境变量,用来显示当前本地时间。类似的环境变量还有很多,比如常用HTTP_HOST、SERVER_NAME、DOCUMENT_URI、DOCUMENT_NAME 等等。

查看所有环境变量

由于无换行所以按ctrl+u,以网页源代码的方式查看更清晰点

------- 应用示例: --------------





This is "Learning Apache SSI" testing page!


Hello SSI


Today is:





数据类型:SSI 中只有一种数据类型“字符串”。例如:



# $MyFirstVar < $MySecondVar //因为2个变量都是字符串值 所以执行的是字符串比较(比较每个字符的ASCII码大小)

SSI常用指令

SSI 的元素并不多,下面列出常用的元素和属性,其它请查看官方参考。

echo :将变量值写入 HTML 代码中。

可以一次输出多个变量值


http://

include :在语句所在位置引入子页面。

include 是 SSI 中最常用的命令,也是 SSI 主要功能的体现。

virtual的值可以是相对路径或绝对路径, 但注意路径中不能包含主机名;

路径可以是相对当前文件(SSI 语句所在的页面)或者从“/”开始,相对网站根目录的路径;


# 路径后允许加参数

SSI 是允许嵌套的;例如,假设有三个文件,file1 include file2,file2中 include file3。

set :创建变量或修改变量值


# 若变量值带引号,可以这样:
//value的值可以是字符串常量或者变量 如:value="$MyVar2"

SSI中的变量都带$前缀 如:$Myvar,为了更清晰的表达一个变量 通常用大括号把变量名包起来 ${MyVar} , 同php



//设置 MyVar3 = MyVar1+MyVar2

// 修改MyVar3的值


// 变量值为 "$IBM"

另一个把变量写在 SSI 语句中的例子:

// 这个比较有用。

fsize 和flastmod

显示指定文件的大小(fsize)和指定文件的最后修改时间(flastmod)

virtual – 与元素 include 中的属性相同,<!--#fsize virtual=”/cgi-bin/cmail.pl” --> 结果返回的是这个 Perl 脚本文件的大小,而不是运行这段 Perl 脚本的结果。

SSI 配置元素

  • config指令
    配置一些 SSI 运行结果;错误信息、文件大小格式、时间格式。
    errmsg属性 当 SSI 语句运行出错时显示的信息。 例如:<!--#config errmsg="出错啦# " -->
    sizefmt 显示以何种方式显示文件大小。这个属性有两个值:bytes 和 abbrev。

    //按bytes大小显示
    //按bytes、Kb或Mb动态显示 视文件大小

    timefmt 显示时间的格式。属性值的参数同 C 标准库中的strftime(3) 相同;



流控制元素

条件语句

SSI 中只有条件语句一种结构,而且结构很简单。基本的控制元素:


html or SSI statements

html or SSI statements

html or SSI statements

## if 语句可以嵌套,你可以在 if 块中再加入一个 if 块语句。

非空字符串为真,空串为假

// 表示条件成立;
//空字符,返回 假,条件不成立。

判断一个变量是否为空字符串的一种写法:<!--#if expr="$MyVar = ‘’" -->

比较运算符 = != < <= > >=


codes

逻辑运算符 ! && || 同JS

运算符优先级 比较运算符优先级高于逻辑运算符 ; && 和 || 具有相同的优先级,可以使用括号 () 进行分组。


任何不被识别为变量或者操作符都被当作是一个字符串。字符串也可以使用引号(单引号或者双引号)括起来。不被引号括起来的字符串中不允许有空格或者 Tab,因为空格是被用来起到分隔的作用。如果一个字符串中包含空格,请使用引号括起来。

正则表达式

Regular expression (正则表达式,缩写 RE),是一种对字符串进行匹配查找的高效模式。几乎每一种语言都支持 RE;Apache SSI 中的 RE 语法同 Perl(版本 5)语言中的相同,但并不完整的支持



说明:此例表示从参数中提取子字符串。$QUERY_STRING 是环境变量,表示通过网页 URL 传递过来的参数,例如:
http://www.IBM.com/index.html?sid=safsaf43513sadfz&cntry=cn 其中,问号后面的部分就是 $QUERY_STRING 的值。

如果等号右边的比较部分是 / / 这种形式,则表示,这部分是正则表达式

/^sid=([a-zA-Z0-9]+)/ 括号表示分组,用圆括号分组的同时,程序自动会将圆括号内匹配的部分提取出来保存在 $1 这个变量中;这个 $1 是系统变量,用来保存正则表达式分组提取出来的各个部分值,一共有 9个,$1-$9。

SSI 与 JavaScript

SSI 与 JS 如何一起使用呢?是这样的,由于服务器并不能识别 JS 代码,所以可以把 SSI 语句放到 JS 代码行中,这样取代一部分 JS 代码的工作,将这部分工作放到服务器端运行。

//正则匹配 形如:/bnn/ 的路径,然后设置变量 SSI变量在JS中输出


SSI 与 日期

前几天遇到这样一个需求:一个 Promotion - 3月3日之前显示默认的内容,3月3日之后显示另外一个内容。下面给出这段代码,分享一下类似这种的要求该如何入手。

# 配置日期格式
# 流程控制语句实现逻辑 正则匹配当前本地日期 捕获年月日
# 嵌套的if 正则跟字符串比较?
3月3日之后

默认

SSI与页面布局

页面布局中一些相对固定的模块,可以通过include的方式包含到页面中。
通常情况下,上面有 4个区域是不经常变动的:Header、Left Nav、Nav Trail 和 Footer。


# 把头部模块包含进来


# 左侧导航模块包含进来
# ~右侧导航模块include进来

# 面包屑模块include进来

Hello SSI




# 页脚模块include进来

# 设置变量protocol初始值
# 若环境变量$HTTPS 开启,则设置变量protocol的值


# 设置变量 变量名比较长的话用大括号包起来比较清晰,易于解析。

根据请求的路径 高亮显示相应的栏目链接

Nav Trail 又叫做 Breadcrumb,中文里我们叫做“当前位置”。在页面上,根据当前页面所在不同,在这个地方会有提示访问者当前所在的位置。如果在每个页面都存在这个提示的话,编辑起来会很麻烦。但现在可以使用 SSI 解决这个问题,只要在每个页面的这个位置 include 一个 SSI 文件就可以了,当前所在位置的工作交给 SSI 来完成。

# 设置变量protocol初始值
# 若url是 https:// 安全访问模式
# 设置变量 protocol的值

设置一系列变量值 当前位置的链接和文本




设置值时是多重if嵌套

# 若是访问/bnn/下非index.html页面
# 设置一级文本和链接变量值

# 若是访问/bnn/books/下非index.html页面
# 设置二级文本和链接变量值 如此类推







输出当前位置时也是多重if嵌套



 > 

 > 

 > 


SSI指令小结

语法: <!--#directive [parm=value] --> ,指令包括:

  • config:设置日期格式等,如:(<!--#config timefmt="%B %Y" -->)
  • echo:打印变量值 (<!--#echo var="VARIABLE_NAEM" -->)
  • exec:用来执行服务器端的命令
  • include:文件包含 (<!--#include virtual="file-name" -->)
  • flastmod:输出指定文件最后修改时间(<!--#flastmod file="filename.shtml" -->)
  • fsize:输出指定文件的大小(<!--#fzie file="filename.shtml" -->)
  • printenv:打印所有环境变量(<!--#printenv -->)
  • set:设置或修改变量 (<!--#set var="foo" value="Bar" -->)
  • if elif endif else:创建条件分支
posted @ 2016-04-15 08:09  stephenykk  阅读(2193)  评论(0)    收藏  举报