🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Apache模块 mod_isapi | [说明](#calibre_link-11) | 仅限于在Windows平台上实现ISAPI扩展 | | --- | --- | | [状态](#calibre_link-12) | 基本(B) | | [模块名](#calibre_link-13) | isapi_module | | [源文件](#calibre_link-14) | mod_isapi.c | | [兼容性](#calibre_link-58) | 仅用于Win32 | ### 概述 本模块实现了互联网服务扩展应用程序编程接口(Internet Server extension API)。本模块使得Windows上的Apache能有限地实现互联网服务扩展(比如调用ISAPI的动态连接库)。 ISAPI扩展模块(.dll文件)是由第三方开发的。Apache开发组没有编写这些模块,因此我们也不对它们提供支持。如果在运行ISAPI扩展过程中发生问题,请直接与ISAPI的作者联系。**请_不要_将此类问题贴在Apache的邮件列表或错误反馈页面上**。 ## 用法 在服务器配置文件中,使用`AddHandler`指令将`isapi-isa`处理器与ISAPI文件关联起来,并通过文件扩展名来建议对应关系。要将任何一个.dll文件作为ISAPI扩展来处理,需要编辑httpd.conf文件,并加入以下行: ``` AddHandler isapi-isa .dll ``` Apache服务器不允许将服务于请求的模块动态地加载,但可以通过在httpd.conf文件中,加入以下语句使一个模块在Apache启动时预先载入系统,并使其驻留在系统中: ``` ISAPICacheFile c:/WebWork/Scripts/ISAPI/mytest.dll ``` 无论是否预载一个ISAPI扩展,所有的ISAPI扩展都使用与CGI脚本相同的许可限制来管理。也就是说,包含ISAPI动态连接库的目录必须要设置"`Options` `ExecCGI`"。 请参阅[附加注释](#calibre_link-154)和[程序员注记](#calibre_link-155)以得到关于`mod_isapi`所提供的特定的ISAPI支持的细节内容。 ## 附加注释 Apache的ISAPI实现了除部分用来处理异步I/O的微软特定(Microsoft-specific)扩展以外的所有ISAPI 2.0规范。Apache的I/O模型不允许使用ISAPI可能用到的异步读写方式。如果ISAPI试图调用不支持的功能,包括异步I/O,在错误日志中会显示一条错误信息以方便系统的调试。由于这类错误信息可能会大量地产生,指令"`ISAPILogNotSupported Off`"可以使这类错误信息不被记录。 在某些服务器上,比如微软的IIS,ISAPI扩展在载入后将驻留在服务器上,直到内存占用过高,或是指定了不同的配置选项。Apache目前在每次请求时,都会加载和卸载特定的ISAPI扩展,除非指定了`ISAPICacheFile`指令。虽然这样看来是效率很低的一种做法,但根据Apache的内存模式使用这种方式是最有效的。许多ISAPI模块与Apache服务器有细微的兼容性问题,卸载这些模块可以保证服务器的稳定运行。 同时请记住Apache支持ISAPI扩展,但它**不支持ISAPI过滤器**。对于ISAPI过滤器的支持可能会在晚些时候加入,但目前没有支持这一功能的计划。 ## 程序员注记 如果你正在开发 Apache 2.0 `mod_isapi`模块,你必须严格按照以下指令的限制来调用`ServerSupportFunction` : `HSE_REQ_SEND_URL_REDIRECT_RESP` 重定向用户到其它的位置。必须使用完整的、合法的URL(比如:`http://server/location`)。 `HSE_REQ_SEND_URL` 重定向用户到其它的位置。这里不能使用一个完整的URL,你不可以传入协议或服务器名(例如:`/location`)。这类重定向由服务器来处理,不是浏览器。 ### 警告 在最近发布的文档中,微软已经试图放弃这两个`HSE_REQ_SEND_URL`函数的差别。但Apache还是将它们视为两个不同的函数加以不同的实现。 `HSE_REQ_SEND_RESPONSE_HEADER` 如果在请求头字符串变量中,请求头的内容后面紧跟一个空行(两个连续的换行),然后再加上请求体的内容,Apache能接受这一相应的请求体。因为请求头变量是以NULL结束的,这个请求体里不能包含NULL。 `HSE_REQ_DONE_WITH_SESSION` Apache认为这是一个空操作,因为当ISAPI处理返回时,会话就结束了。 `HSE_REQ_MAP_URL_TO_PATH` Apache将虚拟名字转换为物理名字。 `HSE_APPEND_LOG_PARAMETER` 这一日志信息可以在以下任一地方捕获: * 在`CustomLog`指令中的 `\"%{isapi-parameter}n\"` 元素里 * 在"`ISAPIAppendLogToQuery` `On`"指令中的"`%q`"日志元素里 * 由"`ISAPIAppendLogToErrors` `On`"指令所产生的错误日志中 第一行的 `%{isapi-parameter}n` 元素总是可用的,并且是推荐的。 `HSE_REQ_IS_KEEP_CONN` 返回Keep-Alive的协商状态。 `HSE_REQ_SEND_RESPONSE_HEADER_EX` 即使`fKeepConn`标志被忽略,还是按有证书的方式来处理。 `HSE_REQ_IS_CONNECTED` 如果请求退出则报告错误。 对于所有不支持的`ServerSupportFunction`调用,Apache返回`FALSE` ,同时将`GetLastError`的值置为`ERROR_INVALID_PARAMETER` 。 `ReadClient`越过初始缓冲区(由`ISAPIReadAheadBuffer`指令定义)得到请求的数据包。根据`ISAPIReadAheadBuffer`(在调用ISAPI处理前缓冲的数据字节数)的设定,较小的请求包当请求被调用时,直接完全地传送到ISAPI扩展。如果请求包很长,ISAPI扩展必须使用`ReadClient`得到剩下的请求数据。 支持`WriteClient` ,但只能使用`HSE_IO_SYNC`标志或不带标志("`0`"值)。任何其它的`WriteClient`请求会被拒绝,并且返回`FALSE` ,同时`GetLastError`的值被置为`ERROR_INVALID_PARAMETER` 。 支持`GetServerVariable` ,虽然扩展服务变量不存在(定义在其它服务器上)。包括`ALL_HTTP`和`ALL_RAW` ,所有的常规Apache CGI环境变量都可以通过`GetServerVariable`得到。 Apache 2.0 `mod_isapi`支持后来版本的ISAPI规范中的新增功能,比如对异步I/O的有限仿真及`TransmitFile`语义。Apache同时也支持ISAPI .dlls 的预载入以提高性能,以上这些在 Apache1.3 `mod_isapi`都没有实现。 ## ISAPIAppendLogToErrors 指令 | [说明](#calibre_link-18) | 把ISAPI扩展的`HSE_APPEND_LOG_PARAMETER`请求记录在错误日志中 | | --- | --- | | [语法](#calibre_link-19) | `ISAPIAppendLogToErrors on|off` | | [默认值](#calibre_link-24) | `ISAPIAppendLogToErrors off` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 基本(B) | | [模块](#calibre_link-22) | mod_isapi | 把ISAPI扩展的`HSE_APPEND_LOG_PARAMETER`请求记录在错误日志中 ## ISAPIAppendLogToQuery 指令 | [说明](#calibre_link-18) | 把ISAPI扩展的`HSE_APPEND_LOG_PARAMETER`请求记录在查询域中 | | --- | --- | | [语法](#calibre_link-19) | `ISAPIAppendLogToQuery on|off` | | [默认值](#calibre_link-24) | `ISAPIAppendLogToQuery on` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 基本(B) | | [模块](#calibre_link-22) | mod_isapi | 把ISAPI扩展的`HSE_APPEND_LOG_PARAMETER`请求记录在查询域中(追加在`CustomLog` `%q`元素后面)。 ## ISAPICacheFile 指令 | [说明](#calibre_link-18) | 启动时载入的ISAPI动态连接库 | | --- | --- | | [语法](#calibre_link-19) | `ISAPICacheFile file-path [file-path] ...` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 基本(B) | | [模块](#calibre_link-22) | mod_isapi | 指定一个需在Apache服务启动的时候载入的以空格分隔的文件列表,这些文件驻留在系统中直至服务器关闭。本指令可以为每个需要的ISAPI动态连接库文件所重复。应指定每个文件的路径。如果不是绝对路径,则会基于`ServerRoot`来处理相对路径。 ## ISAPIFakeAsync 指令 | [说明](#calibre_link-18) | 为ISAPI回调模拟异步支持 | | --- | --- | | [语法](#calibre_link-19) | `ISAPIFakeAsync on|off` | | [默认值](#calibre_link-24) | `ISAPIFakeAsync off` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 基本(B) | | [模块](#calibre_link-22) | mod_isapi | 当设为on时,模拟ISAPI回调的异步支持。 ## ISAPILogNotSupported 指令 | [说明](#calibre_link-18) | 记录ISAPI不支持的功能调用 | | --- | --- | | [语法](#calibre_link-19) | `ISAPILogNotSupported on|off` | | [默认值](#calibre_link-24) | `ISAPILogNotSupported off` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 基本(B) | | [模块](#calibre_link-22) | mod_isapi | 在服务错误日志中记录所有ISAPI扩展不支持的请求。本指令可以帮助系统管理员跟踪错误。把这个指令定义为on以后,如果所有的ISAPI模块都工作良好,应该把它设回为Off。 ## ISAPIReadAheadBuffer 指令 | [说明](#calibre_link-18) | 传送到ISAPI扩展的预读缓冲区大小 | | --- | --- | | [语法](#calibre_link-19) | `ISAPIReadAheadBuffer size` | | [默认值](#calibre_link-24) | `ISAPIReadAheadBuffer 49152` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 基本(B) | | [模块](#calibre_link-22) | mod_isapi | 定义初始调用时传送到ISAPI扩展的最大预读缓冲区大小。所有其它的数据必须通过`ReadClient`回调功能得到;部分ISAPI扩展可能不支持`ReadClient`功能。请参考ISAPI扩展本身对相关问题描述。