自定义错误文档与服务器端包含技术详解
1. 自定义错误文档
1.1 401 未授权错误处理
当用户尝试访问需要登录的网站,却未能输入正确的用户名或密码时,就会收到 401 未授权错误。然而,默认的 401 错误文档往往缺乏详细的说明。
如果你的网站使用了身份验证机制,就应该为用户提供一份错误文档,解释为何他们无法访问页面。若网站是公开的,还需在错误文档中说明用户如何获取访问权限。
以下是一个 401 错误的 HTML 文档示例:
<html>
<head>
<title>Unauthorized</title>
</head>
<body>
<h1>Unauthorized</h1>
<p>
Sorry, the username or password you entered was incorrect. You can go
back to the <a href="/restricted_site/">restricted site</a>, or go to
the <a href="/register.html">registration page</a>.
</p>
</body>
</html>
1.2 其他错误类型
除了 401 和 404 错误,还可以为其他错误创建自定义错误文档,但这并非像处理这两种常见错误那样重要。比如:
-
403 访问被拒绝
:当浏览器没有权限访问请求的文件时返回,通常是由文件权限问题导致。
-
500 服务器错误
:几乎总是由于 CGI 脚本中的错误,导致其无法发送适当的头部信息。
1.3 问答环节
- 问 :能否为 401 和 404 之外的错误创建自定义错误文档?
- 答 :可以,但不如处理这两种最常见错误那么重要。
1.4 测验与练习
测验
- 什么原因导致 401 错误?
- 为什么自定义错误文档通常由 CGI 脚本而非静态 HTML 文档创建?
练习
如果你管理着自己的服务器,尝试为其创建一些自定义错误文档,你的用户会对此表示感激。
测验答案
- 当用户尝试访问使用基本身份验证保护的页面,却未能提交正确的用户名和密码时,就会出现 401 错误。
- 自定义错误文档通常使用 CGI 脚本构建,这样它们可以利用用户尝试查看的页面 URL 或引用 URL。
2. 服务器端包含(SSI)
2.1 SSI 概述
服务器端包含(SSI)是一种绕过 CGI 的快捷方式。CGI 程序独立于 HTML 页面,能够生成复杂的内容提供给 Web 浏览器。而 SSI 是一种简单的命令,可放置在 HTML 页面中,添加诸如读取外部文件、插入当前日期或文件最后修改日期、执行程序并将其输出插入页面等功能。
尽管 SSI 为用户提供的交互水平远不及 CGI,但它的最大优势在于,当你需要在多个页面中使用相同的 HTML 代码片段时,能节省大量的工作。与 CGI 程序一样,SSI 在服务器将响应发送给浏览器之前进行处理。
2.2 SSI 的工作原理
当用户向 Web 服务器发送对 CGI 脚本的请求时,服务器将请求发送给 CGI 脚本,然后将脚本返回的数据发送回请求的用户。而 SSI 的工作方式略有不同。
SSI 页面是指服务器会解析其中 SSI 指令的任何页面。SSI 指令是嵌入在 HTML 注释中的命令,Web 服务器会对其进行解析,并将指令所要求的内容替换进去。
与通常存放在独立目录(如 cgi - bin)中的 CGI 程序不同,SSI 页面与常规 HTML 页面一起位于 Web 目录中。你需要配置 Web 服务器,以区分哪些是常规 HTML 文档,哪些是 SSI 文件。一般来说,会配置服务器解析具有特定扩展名的文件中的 SSI 指令,最常见的是将
.shtml
扩展名与 SSI 关联。若想在网站的每个页面都使用 SSI,也可以配置服务器解析
.html
扩展名的文件中的 SSI 指令。
当用户请求一个 SSI 页面时,Web 服务器会读取该文件并解释其中的指令,然后用指令的执行结果替换指令本身。例如,若在文件中嵌入一个查找当前时间和日期的指令,Web 服务器会将当前时间和日期显示在页面上,替换该指令。
SSI 指令看起来与 HTML 注释相似,这是因为如果在服务器认为是普通 HTML 文件的文档中使用 SSI 指令,Web 浏览器会将其解释为注释,而不会将其作为页面的一部分显示。每个指令都会单独解释,因此如果页面中包含大量指令,Web 服务器的性能可能会受到影响。
2.3 配置 Web 服务器以支持 SSI
在开始为网站创建 SSI 页面之前,需要配置 Web 服务器,使其能够识别哪些文件需要扫描 SSI 指令。具体的配置方法会因所使用的 Web 服务器及其运行的平台而异。
2.3.1 Apache 服务器
要让 Apache 解释 SSI 页面,需要对两个配置文件进行修改:
1. 在相应的配置文件中指定要与 SSI 文件关联的扩展名。(较新的 Apache 版本将所有配置指令合并在
httpd.conf
中,较旧的版本则将此类内容放在
srm.conf
中。)若要将
.shtml
扩展名的文件设置为 SSI 文档,应在文件中添加以下行:
AddType text/x-server-parsed-html .shtml
若要指定其他扩展名的文件为 SSI 文档,可在配置文件中添加额外的行,将上述示例中的
.shtml
扩展名替换为其他 SSI 文档的扩展名。
若希望 Web 服务器在发送所有 HTML 文档之前,先对其进行 SSI 指令解析,可在配置文件中添加以下行:
AddType text/x-server-parsed-html .html
不过,这样做存在安全问题。例如,若网站上有一个留言簿 CGI 程序,为访客提供一个表单,让他们输入简短的消息并显示在页面上。若服务器配置为解析所有 HTML 文档中的 SSI 指令,而用户输入一个删除重要文件(如服务器日志文件)或打印服务器密码文件的指令,该指令在页面渲染时将被执行。因此,当设置服务器在所有 HTML 文档中查找 SSI 指令时,必须格外小心表单输入。
-
还需要在访问配置文件中指定允许使用的指令类型。若要允许显示环境变量和文件统计信息的指令,需启用
Includes功能;若要允许执行外部程序(包括系统命令和 CGI 应用程序)的指令,则需启用ExecCGI功能。将这两个功能分开设置权限的原因是,启用ExecCGI存在安全风险,而Includes功能则相对安全。只有在确实有特定需求时,才应启用ExecCGI。启用Includes较为安全,无需过多担忧。例如,若要同时启用这两个选项,可在httpd.conf、access.conf或.htaccess文件中嵌入以下行:
Options Includes ExecCGI
2.3.2 微软 Internet Information Server(IIS)
微软 IIS 仅支持
#include
指令,该指令可将文件内容插入到指令所在的网页位置。启用此功能无需进行任何配置更改。一般来说,若使用 IIS 且希望在包含方面有更多操作,将页面转换为 ASP 页面并使用该平台内置的包含功能会更简便。
2.4 SSI 指令的使用
2.4.1 基本语法
SSI 指令的语法与 HTML 注释非常相似,其基本格式为:
<!--#command parameter="argument"-->
使用 SSI 指令时,标点符号很重要,必须严格按照上述示例使用所有标点符号。具体而言,
<!--
和
#
符号之间、结束引号和指令结尾
-->
之间不能有空格。此外,SSI 指令区分大小写,指令和参数都应使用小写。
2.4.2 flastmod 指令
以下是一个使用 SSI 指令显示页面最后修改时间的示例:
<html>
<head>
<title>Current Weather</title>
</head>
<body>
<p>
The current weather is a balmy 108 degrees with 90% humidity. You can
expect gale force winds for most of the day, accompanied by torrential
rainstorms and tornado activity.
</p>
<p>
Last modified: <!--#flastmod file="weather.shtml"-->
</p>
</body>
</html>
此页面包含一段关于当前天气的简短描述,底部的
flastmod
指令会插入
file
参数中指定文件的最后修改日期和时间。在这个例子中,被查看的文件
weather.shtml
就是
file
参数中指定的文件。该 SSI 指令很有用,因为它能让页面的查看者确切了解天气信息的时效性。
flastmod
指令不仅可以插入当前查看文件的最后修改日期,还能插入任何文件的最后修改日期。例如,若使用
#include
指令将
weather.txt
文件插入文档,与用户相关的最后修改日期可能是
weather.txt
文件的日期,而非嵌入该文件的 HTML 文档的日期。若要打印该日期,可使用以下指令:
<!--#flastmod file="weather.txt"-->
2.4.3 其他 SSI 指令
除了
flastmod
指令,还有其他 SSI 指令,它们的基本语法与
flastmod
指令相似,但在设计动态网页时提供了更多的灵活性。
| 指令 | 说明 | 语法示例 |
|---|---|---|
#echo
| 插入环境变量的值 |
<!--#echo var="variable_name"-->
|
#include
| 将文本文件的内容直接插入文档 |
<!--#include file="weather.txt"-->
或
<!--#include virtual="/reports/weather.txt"-->
|
#fsize
| 插入文件的大小(以字节为单位) |
<!--#fsize file="visitor.log"-->
|
#exec
| 将外部程序的输出插入页面 |
<!--#exec cmd="/usr/bin/who"-->
或
<!--#exec cgi="/cgi-bin/guestbook.cgi"-->
|
#config
| 指定其他指令输出的格式 |
<!--#config timefmt="%r on %A, %B %e"-->
|
2.5 SSI 指令详细介绍
2.5.1 #echo 指令
#echo
指令用于在页面中插入环境变量的值,其语法为:
<!--#echo var="variable_name"-->
变量可以是 Web 服务器上定义的任何环境变量,包括 Web 服务器设置的任何 CGI 环境变量。此外,还有一些专门与 SSI 相关的环境变量,如下表所示:
| 变量 | 内容 |
|---|---|
DOCUMENT_NAME
| 当前文档的文件名 |
DOCUMENT_URL
| 当前文档的 URL |
QUERY_STRING_UNESCAPED
| 请求中发送的查询字符串,所有 shell 字符使用反斜杠字符进行转义解码 |
DATE_LOCAL
| 根据服务器时钟显示的当前日期 |
DATE_GMT
| 服务器当前的格林威治标准时间日期设置 |
LAST_MODIFIED
| 当前文件的最后修改日期和时间 |
#echo
指令是
flastmod
指令的一种替代方式,但与
flastmod
不同的是,
LAST_MODIFIED
仅适用于当前文件。
2.5.2 #include 指令
#include
指令可将文本文件的内容直接插入文档。例如,若想在网站的多个页面上插入当前的天气预报,且不想在天气变化时对每个页面都进行修改,就可以使用
#include
指令,让服务器在用户请求页面时,自动将包含天气报告的文件内容读取到页面中。
该指令有两个参数:
file
和
virtual
。
-
file
参数指定要包含的文件的位置,相对于指令所在文件的位置。例如,若要在同一目录下的 HTML 文档中包含名为
weather.txt
的文件,可使用以下指令:
<!--#include file="weather.txt"-->
-
virtual参数指定的位置相对于 Web 服务器的文档根目录。若天气报告文件位于 Web 服务器的/reports/weather.txt子目录中,可在需要包含该文件的任何文件中使用以下指令:
<!--#include virtual="/reports/weather.txt"-->
2.5.3 #fsize 指令
#fsize
指令用于插入文件参数中指定文件的大小(以字节为单位)。例如,若要在页面中插入名为
visitor.log
的文件的大小,可使用以下指令:
<!--#fsize file="visitor.log"-->
2.5.4 #exec 指令
#exec
指令可将外部程序的输出插入页面。根据使用的参数不同,可以插入常规应用程序或 CGI 脚本的输出:
- 若使用
cmd
参数,将启动一个正常的应用程序或命令。例如,若想创建一个页面,自动提供登录到 Web 服务器的用户列表,在 UNIX 系统上最简单的方法是运行
who
命令。若要将
who
命令的输出插入 Web 页面,可在页面中包含以下指令:
<!--#exec cmd="/usr/bin/who"-->
-
若使用
cgi参数,将启动一个 CGI 脚本。例如,若要插入名为guestbook.cgi的 CGI 脚本的输出,可使用以下指令:
<!--#exec cgi="/cgi-bin/guestbook.cgi"-->
2.5.5 #config 指令
#config
指令并不向 Web 页面插入内容,而是指定其他指令输出的格式。该指令有三个参数:
-
errmsg
:为执行失败的 SSI 指令设置替代错误消息。例如,若尝试对不存在的文件执行
#fsize
指令,默认情况下,Apache 服务器会打印
[An error occurred while processing this directive]
,而不是文件大小。这个错误消息对用户来说信息不足,可将错误消息更改为更具信息量的内容:
<!--#config errmsg="Whoops, the file doesn't exist!"-->
-
sizefmt
:当使用
#fsize指令在 Web 页面上显示文件大小时,默认情况下,文件大小以字节为单位显示。可使用#config指令将显示的大小四舍五入到最接近的千字节。若要将显示方式更改为千字节,可使用以下命令:
<!--#config sizefmt="abbrev"-->
若要将其改回以字节为单位显示,可使用以下命令:
<!--#config sizefmt="bytes"-->
- timefmt :这是最灵活的配置属性,可更改 SSI 指令显示日期和时间的方式。例如:
<!--#config timefmt="%r on %A, %B %e"-->
该指令会将时间格式更改为在浏览器中显示为类似
07:41:45 PM on Saturday, September 20
的格式。
timefmt
参数中有许多代码,在页面渲染时会被实际的日期和时间信息替换。若要创建新的显示格式,可选择所需的代码,并将它们与任何想要包含在新格式中的文本进行组合。以下是可用的时间代码列表:
| 代码 | 示例 | 定义 |
|---|---|---|
%a
|
Mon
| 缩写的星期几 |
%A
|
Monday
| 完整的星期几 |
%b, %h
|
Aug
| 缩写的月份名称 |
%B
|
August
| 完整的月份名称 |
%d
|
01
| 日期 |
%D
|
08/01/03
| 数字日期 |
%e
|
1
| 无前导零的日期 |
%H
|
18
| 24 小时制的小时数 |
%I
|
07
| 12 小时制的小时数 |
%j
|
365
| 一年中的第几天 |
%m
|
08
| 月份编号 |
%M
|
55
| 分钟数 |
%p
|
AM
|
AM
或
PM
|
%r
|
08:17:59 AM
| 12 小时制的时间字符串 |
%S
|
31
| 秒数 |
%T
|
18:25:31
| 24 小时制的时间 |
%U, %W
|
26
| 一年中的第几周 |
%w
|
7
| 数字表示的星期几(从星期日开始) |
%y
|
97
| 两位数的年份 |
%Y
|
1997
| 四位数的年份 |
%Z
|
CDT
| 时区 |
通过合理使用这些 SSI 指令,可以为网站添加更多的动态功能,提高网站的实用性和用户体验。同时,在配置服务器支持 SSI 时,要充分考虑性能和安全因素,确保网站的稳定运行。
2.6 SSI 指令使用示例
为了更好地理解 SSI 指令的使用,下面给出一个综合示例。假设我们要创建一个简单的网站,包含多个页面,每个页面都需要显示当前日期、某个文件的最后修改时间、文件大小,并且插入一个公共的页脚文件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SSI Example</title>
<!-- 配置时间和大小显示格式 -->
<!--#config timefmt="%Y-%m-%d %H:%M:%S" sizefmt="abbrev" errmsg="Error occurred!" -->
</head>
<body>
<h1>Welcome to Our Site</h1>
<p>Current Date: <!--#echo var="DATE_LOCAL" --></p>
<p>Last Modified Date of data.txt: <!--#flastmod file="data.txt" --></p>
<p>Size of data.txt: <!--#fsize file="data.txt" --></p>
<!-- 插入公共页脚文件 -->
<!--#include file="footer.html" -->
</body>
</html>
在这个示例中:
-
<!--#config timefmt="%Y-%m-%d %H:%M:%S" sizefmt="abbrev" errmsg="Error occurred!" -->
:配置了时间显示格式为
年-月-日 时:分:秒
,文件大小显示为缩写形式(如 KB),并设置了错误消息。
-
<!--#echo var="DATE_LOCAL" -->
:插入当前日期。
-
<!--#flastmod file="data.txt" -->
:显示
data.txt
文件的最后修改日期。
-
<!--#fsize file="data.txt" -->
:显示
data.txt
文件的大小。
-
<!--#include file="footer.html" -->
:插入公共页脚文件。
2.7 SSI 的优缺点分析
2.7.1 优点
- 代码复用 :可以在多个页面中重复使用相同的 HTML 代码片段,如页头、页脚、导航栏等,减少代码冗余,提高开发效率。
- 动态内容生成 :无需复杂的 CGI 程序,就能实现一些基本的动态功能,如显示当前日期、文件最后修改时间等。
- 易于学习和使用 :SSI 指令的语法简单,与 HTML 注释相似,容易上手。
2.7.2 缺点
- 性能影响 :如果页面中包含大量的 SSI 指令,服务器需要对每个指令进行单独解析和处理,会增加服务器的负载,影响网站的性能。
-
安全风险
:特别是启用
ExecCGI功能时,可能会导致安全漏洞,如用户输入恶意指令删除重要文件或获取敏感信息。 - 功能有限 :与 CGI 相比,SSI 提供的交互功能较少,无法实现复杂的动态网页应用。
2.8 SSI 在网站设计中的应用场景
2.8.1 公共元素插入
在网站的多个页面中插入公共的页头、页脚、导航栏等元素。例如,创建一个
header.html
和
footer.html
文件,然后在每个页面中使用
#include
指令插入这些文件:
<!--#include file="header.html" -->
<!-- 页面主体内容 -->
<!--#include file="footer.html" -->
2.8.2 动态信息显示
显示当前日期、文件最后修改时间、文件大小等动态信息。如在新闻网站中,显示文章的发布时间和最后更新时间:
<p>Published: <!--#flastmod file="news_article.html" --></p>
2.8.3 简单脚本执行
在某些情况下,执行简单的外部程序或 CGI 脚本。例如,显示服务器上当前登录的用户列表:
<!--#exec cmd="/usr/bin/who" -->
2.9 SSI 与其他技术的比较
| 技术 | 特点 | 适用场景 |
|---|---|---|
| SSI | 简单易用,适合插入静态或简单动态内容,代码复用性高 | 小型网站、需要插入公共元素和显示基本动态信息的页面 |
| CGI | 功能强大,可实现复杂的动态交互和数据处理 | 大型网站、需要处理大量用户输入和数据库操作的应用 |
| JavaScript | 客户端脚本语言,可实现丰富的交互效果 | 前端页面交互、表单验证、动画效果等 |
2.10 总结
服务器端包含(SSI)是一种简单而实用的技术,它为网站开发者提供了一种便捷的方式来实现代码复用和基本的动态功能。通过合理配置 Web 服务器和使用 SSI 指令,可以在不使用复杂 CGI 程序的情况下,为网站添加一些动态元素,提高网站的实用性和用户体验。
然而,在使用 SSI 时,需要注意性能和安全问题。避免在页面中使用过多的 SSI 指令,谨慎启用
ExecCGI
功能,确保网站的稳定运行。同时,根据网站的具体需求,合理选择 SSI 与其他技术相结合,以实现最佳的开发效果。
2.11 流程图:SSI 页面处理流程
graph TD;
A[用户请求 SSI 页面] --> B[Web 服务器读取文件];
B --> C[解析 SSI 指令];
C --> D{是否有指令需要执行};
D -- 是 --> E[执行指令并获取结果];
D -- 否 --> F[继续解析下一个指令];
E --> F;
F --> G{是否还有指令};
G -- 是 --> C;
G -- 否 --> H[用结果替换指令];
H --> I[将处理后的页面发送给用户];
这个流程图展示了 SSI 页面从用户请求到最终显示的处理过程,帮助我们更好地理解 SSI 的工作原理。
通过以上对自定义错误文档和服务器端包含(SSI)技术的详细介绍,我们了解了如何处理常见的错误情况,以及如何利用 SSI 为网站添加动态功能。希望这些知识能帮助你在网站开发和维护中更加得心应手。
超级会员免费看
7093

被折叠的 条评论
为什么被折叠?



