服务器端包括提供一种将动态内容添加到现有HTML文档的方法。
相关模块 | 相关指令 |
---|---|
本文介绍了服务器端包含,通常简称为SSI。在本文中,我将讨论如何配置服务器以允许SSI,并介绍一些基本的SSI技术,以便将动态内容添加到现有的HTML页面中。
在本文的后半部分,我们将讨论SSI可以完成的一些更高级的操作,例如SSI指令中的条件语句。
SSI(服务器端包含)是放置在HTML页面中的指令,并在服务页面时在服务器上对其进行评估。它们使您可以将动态生成的内容添加到现有的HTML页面,而不必通过CGI程序或其他动态技术来提供整个页面。
例如,您可以将指令放置到现有的HTML页面中,例如:
<!--#echo var="DATE_LOCAL" -->
并且,当该页面被投放时,该片段将被评估并替换为其值:
Tuesday, 15-Jan-2013 19:28:54 EST
什么时候使用SSI,什么时候完全由某个程序生成页面的决定,通常取决于多少页面是静态的,以及每次服务该页面时需要重新计算多少。SSI是添加少量信息(例如当前时间)的一种好方法-如上所示。但是,如果页面的大部分是在投放时生成的,则需要寻找其他解决方案。
要在服务器上允许SSI,必须在httpd.conf
文件中或文件中
具有以下指令.htaccess
:
Options +Includes
这告诉Apache您想允许对文件进行SSI指令解析。请注意,大多数配置包含多个Options
可以相互覆盖的指令。您可能需要将应用于
Options
要启用SSI的特定目录,以确保它最后被评估。
不仅为SSI指令解析任何文件。您必须告诉Apache应该解析哪些文件。有两种方法可以做到这一点。您可以.shtml
使用以下指令,指示Apache解析具有特定文件扩展名的任何文件:
AddType text/html .shtml AddOutputFilter INCLUDES .shtml
这种方法的一个缺点是,如果要向现有页面添加SSI指令,则必须更改该页面的名称以及该页面的所有链接,以便对其进行.shtml
扩展,以便这些指令可以被执行。
另一种方法是使用XBitHack
指令:
XBitHack on
XBitHack
告诉Apache解析文件以获取SSI指令(如果它们设置了执行位)。因此,要将SSI指令添加到现有页面中,而不必更改文件名,只需使用即可使文件可执行chmod
。
chmod +x pagename.html
关于不做什么的简短评论。您偶尔会看到有人建议您只告诉Apache .html
为SSI 解析所有
文件,这样就不必弄乱.shtml
文件名了。这些人也许没有听说过XBitHack
。要记住的事情是,这样做,您需要Apache读取它发送给客户端的每个文件,即使它们不包含任何SSI指令。这会使事情变慢很多,不是一个好主意。
当然,在Windows上,不需要设置执行位,因此对您的选项有一些限制。
在其默认配置中,Apache不会在SSI页面上发送上次修改日期或内容长度的HTTP标头,因为很难为动态内容计算这些值。这可以防止文档被缓存,并导致客户端性能下降。有两种解决方法:
XBitHack Full
配置。这告诉Apache通过仅查看最初请求的文件的日期而忽略任何包含文件的修改日期来确定最后修改日期。mod_expires
在文件上设置明确的到期时间,从而使浏览器和代理知道缓存它们是可接受的。SSI指令具有以下语法:
<!--#function attribute=value attribute=value ... -->
它的格式类似于HTML注释,因此,如果未正确启用SSI,浏览器将忽略它,但在HTML源代码中仍将其可见。如果正确配置了SSI,则该指令将被其结果替换。
函数可以是许多事情之一,在本系列的下一部分中,我们将更多地讨论其中的大多数。现在,这里有一些您可以使用SSI进行操作的示例
<!--#echo var="DATE_LOCAL" -->
该echo
函数只是吐出一个变量的值。有许多标准变量,其中包括可用于CGI程序的整套环境变量。另外,您可以使用set
函数定义自己的变量。
如果您不喜欢打印日期的格式,则可以使用config
带有timefmt
属性的函数
来修改该格式。
<!--#config timefmt="%A %B %d, %Y" -->
Today is <!--#echo var="DATE_LOCAL" -->
This document last modified <!--#flastmod file="index.html" -->
此功能还取决于timefmt
格式配置。
这是SSI的较常见用法之一-输出CGI程序的结果,例如每个人都喜欢的``命中计数器''。
<!--#include virtual="/cgi-bin/counter.pl" -->
以下是一些可以使用SSI在HTML文档中执行的操作的特定示例。
在前面,我们提到您可以使用SSI来通知用户最新的文档修改时间。但是,这样做的实际方法还有些疑问。放置在HTML文档中的以下代码将在页面上放置这样的时间戳。当然,如上所述,您将必须正确启用SSI。
<!--#config timefmt="%A %B %d, %Y" -->
This file last modified <!--#flastmod file="ssi.shtml" -->
当然,您需要将替换为
ssi.shtml
您所引用文件的实际名称。如果您只是在寻找可以粘贴到任何文件中的通用代码,这可能会很不方便,因此您可能想使用该
LAST_MODIFIED
变量:
<!--#config timefmt="%D" -->
This file last modified <!--#echo var="LAST_MODIFIED" -->
有关timefmt
格式的更多详细信息,请转到您喜欢的搜索网站并查找strftime
。语法是一样的。
如果您要管理的站点超过几个页面,则可能会发现对所有这些页面进行更改可能会非常痛苦,尤其是当您试图在所有这些页面上保持某种标准外观时。
将包含文件用于页眉和/或页脚可以减少这些更新的负担。您只需要制作一个页脚文件,然后使用include
SSI命令将其包含在每一页中即可
。该include
函数可以确定该file
属性或该virtual
属性要包括的文件
。该file
属性是相对于当前目录的文件路径
。这意味着它不能是绝对文件路径(以/开头),也不能包含../作为该路径的一部分。该virtual
属性可能更有用,并且应指定相对于所服务文档的URL。它可以以/开头,但必须与所提供的文件位于同一服务器上。
<!--#include virtual="/footer.html" -->
我经常结合最后两件事,将
LAST_MODIFIED
指令放在页脚文件中以包括在内。SSI指令可以包含在包含的文件中,并且includes可以嵌套-也就是说,包含的文件可以包含另一个文件,依此类推。
除了可以config
使用时间格式外,您还可以执行config
其他两项操作。
通常,当您的SSI指令出现问题时,您会收到以下消息:
[an error occurred while processing this directive]
如果您想将该消息更改为其他内容,可以使用函数的errmsg
属性进行更改
config
:
<!--#config errmsg="[It appears that you don't know how to use SSI]" -->
希望最终用户永远不会看到此消息,因为您将在站点上线之前解决SSI指令的所有问题。(对?)
您可以config
使用该sizefmt
属性返回文件大小的格式。您可以根据需要指定bytes
以字节为单位的完整计数,或
abbrev
以Kb或Mb表示缩写的数字。
您可以使用此exec
功能执行其他操作。实际上,您可以让SSI使用shell(/bin/sh
确切地说是,如果您使用Win32,则是DOS shell)来执行命令。例如,以下内容将为您提供目录列表。
<pre>
<!--#exec cmd="ls" -->
</pre>
或者,在Windows上
<pre>
<!--#exec cmd="dir" -->
</pre>
在Windows上,您可能会注意到使用此指令的某些奇怪格式,因为的输出中dir
包含字符串``< dir
>'',这会使浏览器感到困惑。
请注意,此功能极其危险,因为它将执行代码中嵌入的任何代码
exec
。如果您遇到用户可以编辑网页内容的任何情况,例如使用``留言簿'',请确保禁用此功能。您可以
通过指令exec
的IncludesNOEXEC
参数允许SSI,但不允许
功能Options
。
除了吐出内容之外,Apache SSI还为您提供了设置变量的选项,并可以在比较和条件条件中使用这些变量。
使用set
指令,可以设置变量以备后用。我们将在后面的讨论中使用它,因此我们将在这里进行讨论。其语法如下:
<!--#set var="name" value="Rich" -->
除了像这样从字面上设置值之外,您还可以使用任何其他变量,包括环境变量或上面讨论的变量(例如LAST_MODIFIED
,例如)为变量提供值。通过在变量名称前使用美元符号($),可以指定某物是变量,而不是文字字符串。
<!--#set var="modified" value="$LAST_MODIFIED" -->
要将文字美元符号放入变量的值,您需要使用反斜杠对美元符号进行转义。
<!--#set var="cost" value="\$100" -->
最后,如果您想将变量放在更长的字符串中间,并且变量的名称有可能与其他字符冲突,从而与这些字符混淆,则可以将变量名花括号中的变量,以消除这种混乱。(很难给出一个很好的例子,但希望您能明白这一点。)
<!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" -->
现在我们有了变量,并且能够设置和比较它们的值,我们可以使用它们来表达条件。这使SSI成为一种微小的编程语言。
mod_include
提供了if
,
elif
,else
,endif
建设条件语句结构。这使您可以有效地从一个实际页面中生成多个逻辑页面。
此条件构造的结构为:
<!--#if expr="test_condition" -->
<!--#elif expr="test_condition" -->
<!--#else -->
<!--#endif -->
甲test_condition可以是任何种类的逻辑比较的-或者值相互比较来,或测试一个特定值的``真理“”。(如果给定的字符串为非空,则为true。)有关可用的比较运算符的完整列表,请参见mod_include
文档。
例如,如果您希望根据一天中的时间自定义网页上的文本,则可以使用以下食谱,将其放在HTML页面中:
Good
<!--#if expr="%{TIME_HOUR} <12" -->
morning!
<!--#else -->
afternoon!
<!--#endif -->
任何其他变量(您定义的变量或常规环境变量)都可以在条件语句中使用。有关表达式评估引擎的更多信息,请参见Apache HTTP Server中的表达式。
借助Apache的SetEnvIf
指令和其他相关指令设置环境变量的
功能,此功能可以让您在服务器端执行多种动态内容,而无需使用完整的Web应用程序。
SSI当然不能替代CGI或用于生成动态网页的其他技术。但这是在页面上添加少量动态内容的好方法,而无需执行大量额外工作。