📄 ssi.html
字号:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="keywords" content="Apache, 中文, 手册, 中文版, 中文手册, 中文版手册, 参考手册, 中文参考手册, 金步国" />
<meta name="description" content="Apache 2.2 中文版参考手册" />
<meta name="author" content="金步国" />
<link href="../style/css/manual-zip.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-zip-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
<title>服务器端包含入门 - Apache 2.2 中文版参考手册</title>
</head>
<body id="manual-page"><div id="page-header">
<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><p class="apache">Apache HTTP Server 版本2.2</p><img alt="" src="../images/feather.gif" /></div>
<div class="up"><a href="./index.html"><img title="<-" alt="<-" src="../images/left.gif" /></a></div>
<div id="path"><a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">HTTP Server</a> > <a href="http://httpd.apache.org/docs/">文档</a> > <a href="../index.html">版本2.2</a> > <a href="./index.html">如何.../指南</a></div>
<div id="translation-info"> <a href="../translator_announcement.html#thanks">致谢</a> | <a href="../translator_announcement.html#announcement">译者声明</a> | 本篇译者:<a href="mailto:csfrank@citiz.net">金步国</a> | 本篇译稿最后更新:2006年1月9日 | <a href="../translator_announcement.html#last_new">获取最新版本</a></div>
<div id="page-content"><div id="preamble"><h1>服务器端包含入门</h1>
<p>服务器端包含提供了一种对现有HTML文档增加动态内容的方法。</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="related" id="related">简介</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="related">
<tr><th>相关模块</th><th>相关指令</th></tr>
<tr><td><ul><li><code class="module"><a href="../mod/mod_include.html">mod_include</a></code></li><li><code class="module"><a href="../mod/mod_cgi.html">mod_cgi</a></code></li><li><code class="module"><a href="../mod/mod_expires.html">mod_expires</a></code></li></ul></td><td><ul><li><code class="directive"><a href="../mod/core.html#options">Options</a></code></li><li><code class="directive"><a href="../mod/mod_include.html#xbithack">XBitHack</a></code></li><li><code class="directive"><a href="../mod/mod_mime.html#addtype">AddType</a></code></li><li><code class="directive"><a href="../mod/core.html#setoutputfilter">SetOutputFilter</a></code></li><li><code class="directive"><a href="../mod/mod_setenvif.html#browsermatchnocase">BrowserMatchNoCase</a></code></li></ul></td></tr>
</table>
<p>本文针对服务器端包含(SSI)讨论如何配置服务器以允许SSI ,并介绍一些对现有HTML页面增加动态内容的基本SSI技术。</p>
<p>本文后部将讨论用SSI做一些稍微高级的事情,比如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="what" id="what">什么是SSI ?</a></h2>
<p>SSI是嵌入HTML页面中的指令,在页面被提供时由服务器进行运算,以对现有HTML页面增加动态生成的内容,而无须通过CGI程序提供其整个页面,或者使用其他动态技术。</p>
<p>至于什么时候应当用SSI ,而什么时候应当用某些程序生成整个页面,取决于页面中有多少内容是静态的,又有多少内容需要在每次页面被提供时重新计算。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="configuring" id="configuring">配置服务器以允许SSI</a></h2>
<p>要使服务器允许SSI ,必须在<code>httpd.conf</code>或<code>.htaccess</code>文件中有如下配置:</p>
<div class="example"><p><code>
Options +Includes
</code></p></div>
<p>这样就告诉服务器允许解析文件中的SSI指令。注意,在多数配置中,多个<code class="directive"><a href="../mod/core.html#options">Options</a></code>指令会互相覆盖,所以可能需要对使用SSI的目录专门使用一个<code>Options</code>指令,以确保其有效。</p>
<p>并非所有文件中的SSI指令都会被解析,必须告诉Apache应该解析哪些文件。有两种方法使Apache解析带有特定后缀名的文件,比如:<code>.shtml</code> ,配置如下:</p>
<div class="example"><p><code>
AddType text/html .shtml<br />
AddOutputFilter INCLUDES .shtml
</code></p></div>
<p>该方法的缺点之一是,为了使文件具有<code>.shtml</code>后缀从而执行其中的指令,需要加入SSI指令的现有文件的名字,以及所有指向此页面的连接。</p>
<p>另一种方法是,使用<code class="directive"><a href="../mod/mod_include.html#xbithack">XBitHack</a></code>指令:</p>
<div class="example"><p><code>
XBitHack on
</code></p></div>
<p><code class="directive"><a href="../mod/mod_include.html#xbithack">XBitHack</a></code>告诉Apache解析所有设置了执行位的文件中的SSI指令。这样,无需修改文件名,只要用<code>chmod</code>使文件变成可执行的,就可以对现有页面增加SSI指令。</p>
<div class="example"><p><code>
chmod +x pagename.html
</code></p></div>
<p>这里简要说明一点:偶然会有人向你推荐,无须用带<code>.shtml</code>的文件名,只要使Apache解析所有<code>.html</code>文件的SSI就可以了。那些人可能没听说过<code class="directive"><a href="../mod/mod_include.html#xbithack">XBitHack</a></code> 。要知道,这样做会使Apache在发送文件到客户端之前通读此文件,即使其中并没有任何SSI指令,从而对速度有很不利的影响,所以这并不是好办法。</p>
<p>当然,在Windows上,没有对应的执行位可以设置,所以对你的配置方法就有一些限制。</p>
<p>在默认配置的情况下,Apache不会为SSI页面发送最后修改日期或者内容长度的HTTP头,因为这些值对动态页面来说难以确定。这样会阻止页面被缓冲,导致客户端性能有明显的下降。有两种解决方法:</p>
<ol>
<li>设置 <code>XBitHack Full</code> ,告诉Apache在判断最后修改日期时,只查看被请求文件本身的日期,而忽略其中包含的其它文件的修改日期。</li>
<li>使用<code class="module"><a href="../mod/mod_expires.html">mod_expires</a></code>提供的指令为文件设置一个明确的过期时间,并告诉浏览器和代理这个文件可以被缓冲。</li>
</ol>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="basic" id="basic">基本SSI指令</a></h2>
<p>SSI指令有如下语法:</p>
<div class="example"><p><code>
<!--#element attribute=value attribute=value ... -->
</code></p></div>
<p>类似于HTML注释,即使没有正确配置SSI ,它也不会被浏览器显示,但在HTML代码中可见。而若正确配置了SSI ,则指令会被其结果所取代。</p>
<p>其中的元素可以有许多,我们会在下一个版本的文档中讨论其中的大多数,而在这里,仅举几个SSI的例子。</p>
<h3><a name="todaysdate" id="todaysdate">今天的日期</a></h3>
<div class="example"><p><code>
<!--#echo var="DATE_LOCAL" -->
</code></p></div>
<p><code>echo</code>元素用于显示一个变量的值。标准变量有很多,其中包含对CGI程序有效的所有环境变量。并且还可以用<code>set</code>元素定义你自己的专用变量。</p>
<p>如果你不喜欢这种日期格式,可以用<code>config</code>元素的<code>timefmt</code>属性,改变其格式。</p>
<div class="example"><p><code>
<!--#config timefmt="%A %B %d, %Y" --><br />
Today is <!--#echo var="DATE_LOCAL" -->
</code></p></div>
<h3><a name="lastmodified" id="lastmodified">文件的修改日期</a></h3>
<div class="example"><p><code>
This document last modified <!--#flastmod file="index.html" -->
</code></p></div>
<p>这个元素使用<code>timefmt</code>的格式配置。</p>
<h3><a name="cgi" id="cgi">包含一个CGI程序的输出结果</a></h3>
<p>这也是SSI很常见的一个用途:包含一个CGI程序的输出,比如人人喜欢的"点击计数器"。</p>
<div class="example"><p><code>
<!--#include virtual="/cgi-bin/counter.pl" -->
</code></p></div>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="additionalexamples" id="additionalexamples">附加的例子</a></h2>
<p>以下是一些在HTML中使用SSI的特殊例子。</p>
<h3><a name="docmodified" id="docmodified">文档是什么时候被修改的?</a></h3>
<p>前面我们提到过可以用SSI告诉用户文档是什么时候被修改的,但是具体实现方法却未说明。将以下代码放到HTML中,会在页面中产生一个时间戳,当然,你必须首先按前面的方法启用SSI 。</p>
<div class="example"><p><code>
<!--#config timefmt="%A %B %d, %Y" --><br />
This file last modified <!--#flastmod file="ssi.shtml" -->
</code></p></div>
<p>不用说,你应该用你实际引用的文件名来替换<code>ssi.shtml</code> ,所以,如果你想简单地在所有文件中使用这段通用代码以达到这个目的,这个方法就并不方便,就需要用到<code>LAST_MODIFIED</code> 变量:</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -