# 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扩展本身对相关问题描述。
- Apache HTTP Server Version 2.2 文档 [最后更新:2006年3月21日]
- 版本说明
- 从1.3升级到2.0
- 从2.0升级到2.2
- Apache 2.2 新特性概述
- Apache 2.0 新特性概述
- The Apache License, Version 2.0
- 参考手册
- 编译与安装
- 启动Apache
- 停止和重启
- 配置文件
- 配置段(容器)
- 缓冲指南
- 服务器全局配置
- 日志文件
- 从URL到文件系统的映射
- 安全方面的提示
- 动态共享对象(DSO)支持
- 内容协商
- 自定义错误响应
- 地址和端口的绑定(Binding)
- 多路处理模块
- Apache的环境变量
- Apache处理器的使用
- 过滤器(Filter)
- suEXEC支持
- 性能方面的提示
- URL重写指南
- Apache虚拟主机文档
- 基于主机名的虚拟主机
- 基于IP地址的虚拟主机
- 大批量虚拟主机的动态配置
- 虚拟主机示例
- 深入研究虚拟主机的匹配
- 文件描述符限制
- 关于DNS和Apache
- 常见问题
- 经常问到的问题
- Apache的SSL/TLS加密
- SSL/TLS高强度加密:绪论
- SSL/TLS高强度加密:兼容性
- SSL/TLS高强度加密:如何...?
- SSL/TLS Strong Encryption: FAQ
- 如何.../指南
- 认证、授权、访问控制
- CGI动态页面
- 服务器端包含入门
- .htaccess文件
- 用户网站目录
- 针对特定平台的说明
- 在Microsoft Windows中使用Apache
- 在Microsoft Windows上编译Apache
- Using Apache With Novell NetWare
- Running a High-Performance Web Server on HPUX
- The Apache EBCDIC Port
- 服务器和支持程序
- httpd - Apache超文本传输协议服务器
- ab - Apache HTTP服务器性能测试工具
- apachectl - Apache HTTP服务器控制接口
- apxs - Apache 扩展工具
- configure - 配置源代码树
- dbmmanage - 管理DBM格式的用户认证文件
- htcacheclean - 清理磁盘缓冲区
- htdbm - 操作DBM密码数据库
- htdigest - 管理用于摘要认证的用户文件
- httxt2dbm - 生成RewriteMap指令使用的dbm文件
- htpasswd - 管理用于基本认证的用户文件
- logresolve - 解析Apache日志中的IP地址为主机名
- rotatelogs - 滚动Apache日志的管道日志程序
- suexec - 在执行外部程序之前切换用户
- 其他程序
- 杂项文档
- 与Apache相关的标准
- Apache模块
- 描述模块的术语
- 描述指令的术语
- Apache核心(Core)特性
- Apache MPM 公共指令
- Apache MPM beos
- Apache MPM event
- Apache MPM netware
- Apache MPM os2
- Apache MPM prefork
- Apache MPM winnt
- Apache MPM worker
- Apache模块 mod_actions
- Apache模块 mod_alias
- Apache模块 mod_asis
- Apache模块 mod_auth_basic
- Apache模块 mod_auth_digest
- Apache模块 mod_authn_alias
- Apache模块 mod_authn_anon
- Apache模块 mod_authn_dbd
- Apache模块 mod_authn_dbm
- Apache模块 mod_authn_default
- Apache模块 mod_authn_file
- Apache模块 mod_authnz_ldap
- Apache模块 mod_authz_dbm
- Apache模块 mod_authz_default
- Apache模块 mod_authz_groupfile
- Apache模块 mod_authz_host
- Apache模块 mod_authz_owner
- Apache模块 mod_authz_user
- Apache模块 mod_autoindex
- Apache模块 mod_cache
- Apache模块 mod_cern_meta
- Apache模块 mod_cgi
- Apache模块 mod_cgid
- Apache模块 mod_charset_lite
- Apache模块 mod_dav
- Apache模块 mod_dav_fs
- Apache模块 mod_dav_lock
- Apache模块 mod_dbd
- Apache模块 mod_deflate
- Apache模块 mod_dir
- Apache模块 mod_disk_cache
- Apache模块 mod_dumpio
- Apache模块 mod_echo
- Apache模块 mod_env
- Apache模块 mod_example
- Apache模块 mod_expires
- Apache模块 mod_ext_filter
- Apache模块 mod_file_cache
- Apache模块 mod_filter
- Apache模块 mod_headers
- Apache模块 mod_ident
- Apache模块 mod_imagemap
- Apache模块 mod_include
- Apache模块 mod_info
- Apache模块 mod_isapi
- Apache模块 mod_ldap
- Apache模块 mod_log_config
- Apache模块 mod_log_forensic
- Apache模块 mod_logio
- Apache模块 mod_mem_cache
- Apache模块 mod_mime
- Apache模块 mod_mime_magic
- Apache模块 mod_negotiation
- Apache模块 mod_nw_ssl
- Apache模块 mod_proxy
- Apache模块 mod_proxy_ajp
- Apache模块 mod_proxy_balancer
- Apache模块 mod_proxy_connect
- Apache模块 mod_proxy_ftp
- Apache模块 mod_proxy_http
- Apache模块 mod_rewrite
- Apache模块 mod_setenvif
- Apache模块 mod_so
- Apache模块 mod_speling
- Apache模块 mod_ssl
- Apache模块 mod_status
- Apache模块 mod_suexec
- Apache模块 mod_unique_id
- Apache模块 mod_userdir
- Apache模块 mod_usertrack
- Apache模块 mod_version
- Apache模块 mod_vhost_alias
- Developer Documentation for Apache 2.0
- Apache 1.3 API notes
- Debugging Memory Allocation in APR
- Documenting Apache 2.0
- Apache 2.0 Hook Functions
- Converting Modules from Apache 1.3 to Apache 2.0
- Request Processing in Apache 2.0
- How filters work in Apache 2.0
- Apache 2.0 Thread Safety Issues
- 词汇和索引
- 词汇表
- 指令索引
- 指令速查
- 模块索引
- 站点导航