38、自定义错误文档与服务器端包含技术详解

自定义错误文档与服务器端包含技术详解

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 测验与练习

测验
  1. 什么原因导致 401 错误?
  2. 为什么自定义错误文档通常由 CGI 脚本而非静态 HTML 文档创建?
练习

如果你管理着自己的服务器,尝试为其创建一些自定义错误文档,你的用户会对此表示感激。

测验答案
  1. 当用户尝试访问使用基本身份验证保护的页面,却未能提交正确的用户名和密码时,就会出现 401 错误。
  2. 自定义错误文档通常使用 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 指令时,必须格外小心表单输入。

  1. 还需要在访问配置文件中指定允许使用的指令类型。若要允许显示环境变量和文件统计信息的指令,需启用 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 为网站添加动态功能。希望这些知识能帮助你在网站开发和维护中更加得心应手。

## 软件功能详细介绍 1. **文本片段管理**:可以添加、编辑、删除常用文本片段,方便快速调用 2. **分组管理**:支持创建多个分组,不同类型的文本片段可以分类存储 3. **热键绑定**:为每个文本片段绑定自定义热键,实现一键粘贴 4. **窗口置顶**:支持窗口置顶功能,方便在其他应用程序上直接使用 5. **自动隐藏**:可以设置自动隐藏,减少桌面占用空间 6. **数据持久化**:所有配置和文本片段会自动保存,下次启动时自动加载 ## 软件使用技巧说明 1. **快速添加文本**:在文本输入框中输入内容后,点击"添加内容"按钮即可快速添加 2. **批量管理**:可以同时编辑多个文本片段,提高管理效率 3. **热键冲突处理**:如果设置的热键系统或其他软件冲突,会自动提示 4. **分组切换**:使用分组按钮可以快速切换不同类别的文本片段 5. **文本格式化**:支持在文本片段中使用换行符和制表符等格式 ## 软件操作方法指南 1. **启动软件**:双击"大飞哥软件自习室——快捷粘贴工具.exe"文件即可启动 2. **添加文本片段**: - 在主界面的文本输入框中输入要保存的内容 - 点击"添加内容"按钮 - 在弹出的对话框中设置热键和分组 - 点击"确定"保存 3. **使用热键粘贴**: - 确保软件处于运行状态 - 在需要粘贴的位置按下设置的热键 - 文本片段会自动粘贴到当前位置 4. **编辑文本片段**: - 选中要编辑的文本片段 - 点击"编辑"按钮 - 修改内容或热键设置 - 点击"确定"保存修改 5. **删除文本片段**: - 选中要删除的文本片段 - 点击"删除"按钮 - 在确认对话框中点击"确定"即可删除
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值