<-
Apache > HTTP 伺服器 > 文件 > 2.4 版 > 特定平台注意事項

Apache EBCDIC 埠

可用語言:  en  |  ko 

警告:這份文件尚未更新,無法考量 Apache HTTP 伺服器 2.0 版所做的變更。有些資訊可能仍然相關,但請小心使用。
Support Apache!

另請參閱

top

Apache EBCDIC 埠總覽

Apache HTTP 伺服器 1.3 版是第一個移植到使用 EBCDIC 字元集作為原生字元組的主機 (非 ASCII) 機器的版本。

(它是執行 BS2000/OSD 作業系統 的 SIEMENS 主機系列。現在此主機作業系統具有一個源自 SVR4 的 POSIX 子系統)。

埠最初開始的目的是

這份文件是一個依據,說明將埠移植到這部機器的部分設計決策。

top

設計目標

EBCDIC 埠的一個目標是要維持足夠的後相容性,以利於輕鬆轉換到新伺服器,並使這項轉換對 (EBCDIC) CERN 伺服器具有吸引力。這需要加上一個可組態方法來定義 HTML 文件是以 ASCII(舊伺服器接受的唯一格式)還是 EBCDIC(POSIX 子系統的原生文件格式,因此是其他 POSIX 工具,如 grepsed,可用來操作文件的唯一實際格式)儲存。目前解決此問題的方法是「擬似 MIME 格式」,這會被 Apache 伺服器攔截並加以解譯(請參閱下方)。未來的版本可能會透過為必須轉換的所有文件定義「ebcdic-handler」來解決此問題。

top

技術解決方案

由於 Apache 的所有輸入和輸出都以 BUFF 資料類型及其方法為基礎,因此最簡單的解決方案就是將轉換加入 BUFF 處理常式。轉換必須隨時都能設定,因此 BUFF 標記已新增這項功能,定義 BUFF 物件目前已啟用轉換或尚未啟用轉換。會在 HTTP 協定的幾個點修改此標記

top

移植備註

  1. 程式碼中相關變動已編入 #ifdef 的兩個類別

    #ifdef CHARSET_EBCDIC

    任何基於 EBCDIC 的機器所需的程式碼。這包括字元轉換、兩個字元集在連續性上的差異,用來指出 HTTP 協定的哪個部分必須轉換以及哪個部分不用轉換的標記,等等

    #ifdef _OSD_POSIX

    僅限於 SIEMENS BS2000/OSD 主機平台所需的程式碼。這處理僅限 BS2000/OSD 平台所需的包含檔案差異和 socket 實作主題。

  2. 選擇不使用 Socket 層級的 ASCII 和 EBCDIC 轉換功能(BS2000 POSIX 有支援這個 Socket 選項),這項功能故意捨棄未進行挑選,因為 HTTP 協定的位元組串流由協定相關字串和非協定相關的原始檔案資料混合組成。HTTP 協定字串總是用 ASCII 編碼(GET 要求、任何標題:行、區塊化資訊等等),然而檔案傳輸部分通常應該由伺服器「傳遞」。「協定字串」和「原始資料」的區別透過函數反映在伺服器程式碼中,例如:bgets()rvputs() 適用於字串,以及 bwrite() 函數適用於二進位資料。因此,所有資料的全面轉換並不足夠。

    (當然,如果要處理文字檔案,必須採取措施,讓 EBCDIC 文件總是使用 ASCII 處理)

  3. 所以,這個埠為伺服器內部字串(編譯器則將其轉換為 EBCDIC 字串)和所有伺服器產生的文件內建了協定層級轉換。伺服器程式碼中普遍使用的硬指標 ASCII 逃逸字元 \012\015 是例外:它們已經是 ASCII \n\r 的二進位編碼,而且不能再轉換為 ASCII 一次。這個例外只與伺服器產生的字串相關;並且假設不包含 ASCII 新行字元的外部 EBCDIC 文件。

  4. 透過檢查 BUFF 管理常式的呼叫層級,我增加了會在每個 puts/write/get/gets 交叉的「ebcdic/ascii 轉換層級」,以及允許啟用/停用動態轉換的轉換旗標。通常,一個文件從原始來源(檔案或 CGI 輸出)到目標(要求的用戶端)會兩次跨越這個層級:檔案 -> Apache,和 Apache -> 用戶端

    現在伺服器可以以 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/fooMIME類型都可以通過使用AddType為其配置MIME類型text/x-ascii-foo作為「原始 ASCII」提供。

  6. 非文本文件總是作為「二進制」提供,不會經過轉換。這對 GIF/ZIP/AU 等文件類型來說似乎是最明智的選擇。當然,這需要使用者使用「rcp -b」二進制交換機將它們複製到主機電腦。

  7. 伺服器解析檔案總是假設以機器所使用的原生格式(EBCDIC)儲存,並在處理後進行轉換。

  8. 對於 CGI 輸出,CGI 指令碼決定是否需要轉換:透過設定適當的內容類型,可以轉換文字檔案或將 GIF 輸出原樣傳遞。後者的範例是我們也已移植的 wwwcount 程式。

top

文件儲存注意事項

二進制檔案

所有具有Content-Type:開頭不為text/的檔案都被伺服器視為二進制檔案,且不會進行任何轉換。二進制檔案的範例有 GIF 影像、gzip 壓縮檔案等。

在主機電腦和 Unix 電腦或 Windows 電腦之間交換二進制檔案時,請務必使用 FTP「二進制」命令(TYPE I),或從主機電腦使用rcp -b命令(在 unixrcp中不支援-b交換機)。

文字文件

伺服器的預設假設是文字檔案(所有以text/開頭的Content-Type:)儲存在 EBCDIC,這是主機的原生字元集。

伺服器側包含的文件

目前 SSI 文件只能儲存在 EBCDIC 中。沒有提供在處理前由 ASCII 轉換它的規定。

top

Apache 模組狀態

模組 狀態 注意事項
核心 +
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 伺服器的問題應導向我們的 IRC 頻道 #httpd,位置在 Libera.chat,或傳送至我們的郵件清單