📄 ssi.html
字号:
<div class="example"><p><code>
<!--#config timefmt="%D" --><br />
This file last modified <!--#echo var="LAST_MODIFIED" -->
</code></p></div>
<p>有关<code>timefmt</code>格式的细节,可以到<a href="http://www.google.com/">google</a>查找<code>strftime</code> ,其语法是相同的。</p>
<h3><a name="standard-footer" id="standard-footer">包含一个标准页脚</a></h3>
<p>当你管理一个拥有许多页面的站点,你会发现对所有页面同时做改动是很痛苦的,尤其是在试图对所有页面维持某种标准视觉效果的时候。</p>
<p>使用包含一个页眉/页脚的方法,可以减轻修改的负担。你只要制作一个页脚文件,并用<code>include</code>命令包含到每个页面即可。<code>include</code>元素能按<code>file</code>属性或<code>virtual</code>属性判断应该包含的文件。<code>file</code>属性是一个<em>相对于当前目录</em>的文件路径,即不能是一个绝对路径(以"/"开头)或包含"../"的路径。<code>virtual</code>属性可能更有用,它是一个相对于被提供的文档的URL ,可以以"/"开头,但必须与被提供的文档位于同一服务器上。</p>
<div class="example"><p><code>
<!--#include virtual="/footer.html" -->
</code></p></div>
<p>SSI指令和页脚文件相结合使用是很有用的,比如在页脚文件中使用<code>LAST_MODIFIED</code>指令。SSI指令可以出现在包含文件中,而<code>include</code>可以嵌套,即一个包含文件还可以再包含另外一个。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="config" id="config">我还能设置其它什么?</a></h2>
<p><code>config</code>除了能设置时间格式,还有两种用途。</p>
<p>当SSI指令发生错误时,会产生如下消息:</p>
<div class="example"><p><code>
[an error occurred while processing this directive]
</code></p></div>
<p>为了改变消息的形式,可以使用<code>config</code>元素的<code>errmsg</code>属性:</p>
<div class="example"><p><code>
<!--#config errmsg="[It appears that you don't know how to use SSI]" -->
</code></p></div>
<p>希望最终用户永远也不会看到这个消息,因为在网站投入运行之前你已经把这些问题都解决了。是吗?</p>
<p>还可以使用<code>config</code>的<code>sizefmt</code>属性设置返回的文件大小的格式,或者是以<code>bytes</code>为单位,或者是以Kb或Mb为单位的<code>简写(abbrev)</code>。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="exec" id="exec">执行命令</a></h2>
<p>我期望未来几个月内能再写一篇小型的CGI程序使用SSI的文章,而这里仅介绍<code>exec</code>的使用。SSI确实可以利用shell(<code>/bin/sh</code> ,精确地说,还可以是Win32中的DOS shell)来执行命令。下例产生一个目录列表:</p>
<div class="example"><p><code>
<pre><br />
<!--#exec cmd="ls" --><br />
</pre>
</code></p></div>
<p>或者在Windows中:</p>
<div class="example"><p><code>
<pre><br />
<!--#exec cmd="dir" --><br />
</pre>
</code></p></div>
<p>你可能会发现,在Windows中这个指令的结果有些奇怪,<code>dir</code>的输出中包含有字符串"<<code>dir</code>>",它会使浏览器产生混淆。</p>
<p>注意,这个功能是<strong>极度危险</strong>的,因为它会执行任何包含在<code>exec</code>标记中的命令。如果用户有可能修改你的网页内容,比如"留言本",那么你一定要关闭这个功能。可以在<code>Options</code>指令中加上<code>IncludesNOEXEC</code>参数,以关闭<code>exec</code>功能,同时又保留SSI。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="advanced" id="advanced">高级SSI技术</a></h2>
<p>除了分离内容,Apache SSI还有设置变量的操作,并且还可以将这些变量用在比较和条件表达式中。</p>
<h3><a name="caveat" id="caveat">警告</a></h3>
<p>本文中讨论的大多数功能仅在Apache1.2及更新版本中有效。如果你运行的不是Apache1.2及更新版本,请立刻或者尽快升级,现在就动手,我们会等你弄好了再继续往下讲。</p>
<h3><a name="variables" id="variables">设置变量</a></h3>
<p>使用<code>set</code>指令可以设置变量以备后用,其语法是:</p>
<div class="example"><p><code>
<!--#set var="name" value="Rich" -->
</code></p></div>
<p>除了设置字面变量以外,还可以设置其他任何变量,比如<a href="../env.html">环境变量</a>和此前提到过的一些变量(如<code>LAST_MODIFIED</code>),作为你的专用变量。在变量名前面缀以"$",表示它是一个变量,而不是一个字面字符串。</p>
<div class="example"><p><code> <!--#set var="modified" value="$LAST_MODIFIED" -->
</code></p></div>
<p>若要在字面字符串中使用"$",必须使用转义符号"\$":</p>
<div class="example"><p><code>
<!--#set var="cost" value="\$100" -->
</code></p></div>
<p>最后,如果要在较长的字符串中使用变量,可以用花括号把变量名括起来,以免变量名与其他字符混淆(要对这种情况举例说明有点难度,但还是希望你能领会)。</p>
<div class="example"><p><code>
<!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" -->
</code></p></div>
<h3><a name="conditional" id="conditional">条件表达式</a></h3>
<p>有了变量,就可以设置和比较它们的值以表示条件,SSI也因此成为一种简洁的编程语言。<code class="module"><a href="../mod/mod_include.html">mod_include</a></code>提供了<code>if</code>, <code>elif</code>, <code>else</code>, <code>endif</code>等结构以构造条件语句,从同一个页面高效地产生多个逻辑页面。</p>
<p>条件结构如下:</p>
<div class="example"><p><code>
<!--#if expr="test_condition" --><br />
<!--#elif expr="test_condition" --><br />
<!--#else --><br />
<!--#endif -->
</code></p></div>
<p><em>test_condition</em>可以是任何逻辑比较:可以是一个值和另一个值比较,也可以是测试一个特定的值是否为"真"(一个给定的字符串如果非空则为真)。完整的比较操作符列表,参见<code class="module"><a href="../mod/mod_include.html">mod_include</a></code> 。以下是可能会用到的一些例子。</p>
<p>在配置文件中,可以这样设置:</p>
<div class="example"><p><code>
BrowserMatchNoCase macintosh Mac<br />
BrowserMatchNoCase MSIE InternetExplorer
</code></p></div>
<p>如果客户端在Macintosh上运行Internet Explorer,则上例设置环境变量"Mac"和"InternetExplorer"都为真。</p>
<p>然后,在允许SSI的文档中,可以这样设置:</p>
<div class="example"><p><code>
<!--#if expr="${Mac} && ${InternetExplorer}" --><br />
Apologetic text goes here<br />
<!--#else --><br />
Cool JavaScript code goes here<br />
<!--#endif -->
</code></p></div>
<p>我一点也不反对在Mac上运行IE,只是上个星期我花了好几个小时试图在Mac上的IE中使用JavaScript,而它在其他地方都能正常运作,以上只是一个临时的妥协方案。</p>
<p>任何其他变量(或者是你定义的,或者是标准的环境变量)都可以用于条件语句。利用Apache的<code>SetEnvIf</code>以及其他相关指令设置环境变量,此功能可以很好地实现动态页面而无须借助于CGI。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="conclusion" id="conclusion">总结</a></h2>
<p>SSI固然不能替代CGI或者其他动态页面技术,但它是在页面中插入众多小型的动态片段的优秀方法,而无须大量额外的操作。</p>
</div></div>
<div id="footer">
<p class="apache">本文允许自由使用、分发、转载,但必须保留译者署名;详见:<a href="../translator_announcement.html#announcement">译者声明</a>。</p>
<p class="menu"><a href="../mod/index.html">模块索引</a> | <a href="../mod/directives.html">指令索引</a> | <a href="../faq/index.html">常见问题</a> | <a href="../glossary.html">词汇表</a> | <a href="../sitemap.html">站点导航</a></p></div>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -