<-
Apache > HTTP Server > 文档 > 版本 2.4 > 平台特定说明

Apache EBCDIC 端口

可用语言:  en  |  ko 

警告: 本文档尚未更新以反映 Apache HTTP Server 2.0 版本中的更改。某些信息可能仍然相关,但请谨慎使用。
Support Apache!

另请参阅

top

Apache EBCDIC 端口概述

Apache HTTP Server 版本 1.3 是第一个包含移植到使用 EBCDIC 字符集作为其本机代码集的(非 ASCII)大型机版本的版本。

(它是运行 BS2000/OSD 操作系统 的西门子大型机系列。这个大型机操作系统现在具有一个源自 SVR4 的 POSIX 子系统)。

移植最初是为了

本文档旨在说明移植到此机器的一些设计决策。

top

设计目标

EBCDIC 移植的一个目标是保持与(EBCDIC)CERN 服务器的足够向后兼容性,以使迁移到新服务器变得有吸引力且容易。这需要添加一种可配置的方法来定义 HTML 文档是存储在 ASCII 中(旧服务器接受的唯一格式)还是存储在 EBCDIC 中(POSIX 子系统中的本机文档格式,因此也是其他 POSIX 工具(如 grepsed)可以在文档上操作的唯一现实格式)。目前对此的解决方案是一种“伪 MIME 格式”,该格式由 Apache 服务器拦截和解释(见下文)。未来的版本可能会通过为所有必须转换的文档定义一个“ebcdic 处理程序”来解决这个问题。

top

技术解决方案

由于所有 Apache 输入和输出都基于 BUFF 数据类型及其方法,因此最简单的解决方案是将转换添加到 BUFF 处理例程中。转换必须在任何时候都可以设置,因此添加了一个 BUFF 标志,该标志定义 BUFF 对象当前是否启用了转换。此标志在 HTTP 协议中的几个点被修改

top

移植说明

  1. 源代码中的相关更改被 #ifdef 分为两类

    #ifdef CHARSET_EBCDIC

    任何基于 EBCDIC 的机器都需要代码。这包括字符转换、两个字符集的连续性差异、指示 HTTP 协议的哪一部分必须转换以及哪一部分不需要转换的标志

    #ifdef _OSD_POSIX

    仅西门子 BS2000/OSD 大型机平台需要的代码。这处理仅在 BS2000/OSD 平台上需要的包含文件差异和套接字实现主题。

  2. 有意没有选择在套接字级别(在 BS2000 POSIX 上,有一个支持此功能的套接字选项)之间进行 ASCII 和 EBCDIC 转换,因为 HTTP 协议级别的字节流由协议相关字符串和非协议相关原始文件数据混合组成。HTTP 协议字符串始终以 ASCII 编码(GET 请求、任何 Header: 行、分块信息),而文件传输部分(,GIF 图像、CGI 输出)通常应该只是由服务器“通过”。这种“协议字符串”和“原始数据”之间的分离在服务器代码中通过 bgets()rvputs() 等字符串函数以及 bwrite() 等二进制数据函数反映出来。因此,对所有内容进行全局转换将不合适。

    (当然,在文本文件的情况下,必须做出规定,以便始终以 ASCII 格式提供 EBCDIC 文档)

  3. 因此,此端口具有一个内置的协议级别转换,用于服务器内部字符串(编译器将其转换为 EBCDIC 字符串),因此对于所有服务器生成的文档。服务器代码中无处不在的硬编码 ASCII 转义符 \012\015 是一个例外:它们已经是 ASCII \n\r 的二进制编码,并且不得再次转换为 ASCII。此例外仅与服务器生成的字符串相关;并且外部 EBCDIC 文档预计不包含 ASCII 换行符。

  4. 通过检查 BUFF 管理例程的调用层次结构,我添加了一个“ebcdic/ascii 转换层”,该层将在每次 puts/write/get/gets 上被穿过,以及一个允许在运行时启用/禁用转换的转换标志。通常,文档从其原始源(文件或 CGI 输出)到其目标(请求客户端)会穿过此层两次:file -> ApacheApache -> client

    服务器现在可以以 EBCDIC 格式读取 CGI 脚本输出的标头行,然后发现脚本输出的其余部分是 ASCII(例如,在 WWW 计数器程序的输出情况下:文档主体包含一个 GIF 图像)。所有标头处理都在本机 EBCDIC 格式中完成;然后,服务器根据正在提供的文档类型来确定文档主体(当然,除了分块信息之外)是否已经是 ASCII,还是必须从 EBCDIC 转换。

  5. 对于文本文档(MIME 类型 text/plain、text/html),可以使用隐式转换为 ASCII,或者(如果用户希望以原始 ASCII 格式存储某些文档以实现更快的提供,或者因为文件位于 NFS 挂载的目录树上)可以不进行转换地提供。

    示例

    要将后缀为 .ahtml 的文件作为原始 ASCII text/html 文档提供,而不进行隐式转换(以及后缀为 .ascii 的文件作为 ASCII text/plain 提供),请使用以下指令

    AddType text/x-ascii-html .ahtml
    AddType text/x-ascii-plain .ascii

    类似地,任何 text/foo MIME 类型都可以通过使用 AddType 为其配置 MIME 类型“text/x-ascii-foo”来作为“原始 ASCII”提供。

  6. 非文本文档始终以“二进制”格式提供,不进行转换。这似乎是对 .e.g.,GIF/ZIP/AU 文件类型最明智的选择。当然,这要求用户使用“rcp -b”二进制开关将它们复制到大型机主机。

  7. 服务器解析的文件始终假定为以机器上使用的本机(,EBCDIC)格式存储,并在处理后进行转换。

  8. 对于 CGI 输出,CGI 脚本确定是否需要转换:通过设置适当的 Content-Type,可以转换文本文件,或者可以不修改地传递 GIF 输出。后一种情况的一个例子是我们也移植的 wwwcount 程序。

top

文档存储说明

二进制文件

所有 Content-Type: 不以 text/ 开头的文件都被服务器视为二进制文件,并且不会进行任何转换。二进制文件的示例包括 GIF 图像、gzip 压缩文件等。

在大型机主机和 Unix 机器或 Windows PC 之间交换二进制文件时,请确保使用 ftp“二进制”(TYPE I)命令,或者从大型机主机使用 rcp -b 命令(-b 开关在 unix rcp 中不受支持)。

文本文档

服务器的默认假设是文本文件(,所有 Content-Type:text/ 开头的文件)都存储在主机的本机字符集中,即 EBCDIC。

服务器端包含文档

SSI 文档目前必须仅存储在 EBCDIC 中。没有提供在处理之前将其从 ASCII 转换的规定。

top

Apache 模块状态

模块 状态 说明
core +
mod_access +
mod_actions +
mod_alias +
mod_asis +
mod_auth +
mod_authn_anon +
mod_authn_dbm ? 使用自己的 libdb.a
mod_authz_dbm ? 使用自己的 libdb.a
mod_autoindex +
mod_cern_meta ?
mod_cgi +
mod_digest +
mod_dir +
mod_so - 没有共享库
mod_env +
mod_example - (仅测试平台)
mod_expires +
mod_headers +
mod_imagemap +
mod_include +
mod_info +
mod_log_agent +
mod_log_config +
mod_log_referer +
mod_mime +
mod_mime_magic ? 尚未移植
mod_negotiation +
mod_proxy +
mod_rewrite + 未测试
mod_setenvif +
mod_speling +
mod_status +
mod_unique_id +
mod_userdir +
mod_usertrack ? 未测试
top

第三方模块状态

模块 状态 说明
JK(以前称为 mod_jserv) - JAVA 仍在移植中。
mod_php3 + mod_php3 运行良好,具有 LDAP 和 GD 以及 FreeType 库。
mod_put ? 未测试
mod_session - 未测试

可用语言:  en  |  ko 

top

评论

注意
这不是一个问答区。此处发布的评论应针对改进文档或服务器的建议,如果这些建议已被实施或被认为无效/偏离主题,则可能会被我们的版主删除。有关如何管理 Apache HTTP Server 的问题,请咨询我们的 IRC 频道 #httpd(在 Libera.chat 上),或发送到我们的 邮件列表