本文档介绍了Apache HTTPD API从2.2版到2.4版的更改,这些更改可能是模块/应用程序开发人员和核心黑客所感兴趣的。从2.4分支的第一个GA版本开始,API的兼容性在2.4分支的生命期内一直保留。( 2.4版的 VERSIONING说明提供了有关API兼容性的更多信息。)
API更改分为两类:全新的API和已扩展或更改的现有API。后者又分为所有更改都是向后兼容的(因此现有模块可以忽略它们),以及可能需要维护人员注意的更改。与从HTTPD 2.0到2.2的过渡一样,现有的模块和应用程序将需要重新编译,并且可能需要引起注意,但是大多数模块和应用程序都不需要进行任何实质性的更新(尽管某些组件和应用程序可以利用API的更改来进行重大改进)。
就本文档而言,API是根据公共头文件拆分的。这些标头本身就是参考文档,可用于通过生成可浏览的HTML参考make docs。
引入了一种新的API,用于解析和评估布尔表达式和代数表达式,包括提供标准语法和自定义变体。
引入了一个新的API,以使httpd子进程能够满足不同的目的。
ap_mpm_run被一个新的mpm钩子代替。也ap_graceful_stop_signalled丢失了,
ap_mpm_register_timed_callback是新的。
除了现有的regexp包装器之外,ap_rxplus现在还提供了新的更高级别的API
。这提供了编译像Perl样式的表达式s/regexp/replacement/flags
并针对任意字符串执行它们的功能。还添加了对正则表达式反向引用的支持。
为模块分配和管理内存插槽(最常见的是共享内存)引入API。
用于管理共享对象缓存的API。
心跳模块的通用结构
的功能签名ap_parse_htaccess已更改。apr_table_t现在必须传递允许替代的单个指令中的一个(替代仍然存在)。
AP_DECLARE_MODULE宏来声明所有模块。APLOG_USE_MODULE多文件模块中每个模块日志级别所需的新宏。check_config钩ap_process_fnmatch_configs()处理通配符的新功能ap_configfile_t,ap_cfg_getline(),
ap_cfg_getc()返回错误代码,并添加
ap_pcfg_strerror()用于获取错误描述。AllowOverrideList指令从.htaccess文件中调用的配置
。ap_check_cmd_context()接受新的标志NOT_IN_HTACCESS来检测这种情况。ap_default_type,ap_requires所有2.2 authnz APIap_get_server_name_for_url支持IPv6文字的新功能。ap_register_errorlog_handler注册错误日志格式字符串处理程序的新功能。error_log钩子的参数已更改。声明已移至
http_core.h。ap_state_query确定服务器是否处于初始配置预检阶段的新功能。与在过程池中创建池用户数据条目的旧方法相比,这既易于使用,又更正确。ap_get_conn_socket获取连接的套接字描述符的新函数。应该使用它代替直接访问核心连接配置。APLOG_TRACEnCONN_STATE价值ap_escape_html已更新;
ap_unescape_all,ap_escape_path_segment_bufferEXEC_ON_READ配置读取阶段之后加载其他模块的模块需要在ap_reserve_module_slots()或
ap_reserve_module_slots_directive()中
调用pre_config hook。APLOG_TRACEnap_log_*error成为宏包装器(如果使用了APLOG_MARK宏,则向后兼容
,但不能再#ifdef在参数列表中使用)module_index 添加到error_log钩子ap_log_command_lineEOR铲斗类型ap_process_async_requestAP_AUTH_INTERNAL_PER_CONF和
AP_AUTH_INTERNAL_PER_URIaccess_checker_ex挂钩可应用其他访问控制和/或绕过身份验证。ap_hook_check_access_ex,
ap_hook_check_access,ap_hook_check_authn,
ap_hook_check_authz它接受
AP_AUTH_INTERNAL_PER_*标志ap_hook_access_checker,
access_checker_ex,ap_hook_check_user_id,
ap_hook_auth_checker如果可能的话,AP_AUTH_INTERNAL_PER_CONF
建议使用来注册所有访问控制挂钩(包括身份验证和授权挂钩)。如果所有模块的访问控制钩都使用此标志注册,则每当服务器处理与初始请求相同的访问控制配置指令集匹配的内部子请求时(这是常见的情况),都可以避免调用访问控制钩另一个时间。
如果您的模块要求使用旧的行为,并且必须使用与初始请求不同的URI对每个子请求执行访问控制检查,即使该URI与相同的访问控制配置指令集匹配,也请使用
AP_AUTH_INTERNAL_PER_URI。
介绍用于authn和authz的新提供程序框架
commit_entity()向缓存提供程序接口引入一个功能,允许对缓存进行原子写入。添加一个cache_status()
钩子以报告缓存决策。所有私有结构和功能均被删除。
这引入了低级API来发送任意标头,并公开了用于处理HTTP OPTIONS和TRACE的函数。
更改磁盘缓存的磁盘格式以支持原子缓存更新而不进行锁定。主体文件的设备/节点对嵌入在头文件中,从而允许确认头和主体属于彼此。
为了与服务器中其他模块的命名保持一致,mod_disk_cache模块已重命名为mod_cache_disk。
的API mod_request,可在需要时使输入数据可用于多个应用程序/处理程序模块,并解析HTML表单数据。
accept,lockfile,lock_mech,
set_scoreboard(锁使用新ap_mutex API)mpm_query,timed_callback,和
get_namemonitor钩子
ap_reclaim_child_processes,
ap_relieve_child_processesap_get_scoreboard_worker引入了向后兼容版本后,该版本不向后兼容。额外的proxy_balancer支持。儿童状态的东西进行了修改。
引入了用于管理HTTP Cookies的新API。
没有可用的描述
httpd中APR proc和全局互斥的包装,为底层机制和锁定文件位置提供通用配置。
新: ap_args_to_table
新: ap_recent_ctime_ex
为了利用按模块日志级别的配置,任何调用ap_log_*函数的源文件都应声明其属于哪个模块。如果调用了模块的module_struct
foo_module,则可以使用以下代码保持与HTTPD 2.0和2.2的向后兼容性:
#include <http_log.h>
#ifdef APLOG_USE_MODULE
APLOG_USE_MODULE(foo);
#endif
注意:这对于C ++语言模块是绝对必需的。可以跳过C语言模块,尽管这样会破坏没有该模块的文件的特定于日志级别的支持。
ap_log_*函数的参数数量和的定义APLOG_MARK已更改。通常,更改是完全透明的。但是,如果模块将其APLOG_MARK用作自己函数的参数,或者模块调用时ap_log_*未传递
,则需要进行更改APLOG_MARK。使用包装器的模块ap_log_*通常使用这两种构造。
更改传递APLOG_MARK给其自身函数的代码的最简单方法是定义并使用另一个宏,该宏扩展为那些函数所需的参数,APLOG_MARK
仅应在ap_log_*
直接调用时使用。这样,代码将保持与HTTPD 2.0和2.2的兼容性。
在2.4与早期版本之间,ap_log_*未通过
调用的代码APLOG_MARK必然有所不同,因为2.4需要新的第三个参数
APLOG_MODULE_INDEX。
/* code for httpd 2.0/2.2 */
ap_log_perror(file, line, APLOG_ERR, 0, p, "Failed to allocate dynamic lock structure");
/* code for httpd 2.4 */
ap_log_perror(file, line, APLOG_MODULE_INDEX, APLOG_ERR, 0, p, "Failed to allocate dynamic lock structure");
ap_log_*error现在实现为宏。这意味着不再可以#ifdef在的参数列表内使用ap_log_*error,因为这将导致根据C99的不确定行为。
启动后调用时server_rec必须将指针传递给该指针
ap_log_error()。这总是很合适,但是NULL server_rec2.4中的限制比以前的版本还要多。从2.3.12开始,全局变量
ap_server_conf始终可以用作server_rec参数,因为
NULL只有在传递NULL
给时才有效ap_log_error()。 ap_server_conf
仅在没有更合适的选项时才server_rec
使用。
考虑以下更改以利用新的
APLOG_TRACE1..8日志级别:
APLOG_DEBUG并考虑是否其中一个APLOG_TRACEn级别更合适。APLOG_TRACEn级别。如果根据配置的日志级别需要跳过昂贵的跟踪处理,请使用
和宏首先检查是否启用了跟踪。APLOGtracenAPLOGrtracen模块有时会在其日志消息中添加进程ID和/或线程ID。现在默认情况下会记录这些ID,因此模块可能无需显式记录它们。(用户可以将它们从错误日志格式中删除,但是如果需要进行问题诊断,可以指示他们将其重新添加。)
ap_default_type()ap_get_server_name()ap_get_server_name_for_url()改用。此新功能处理服务器名称是IPv6文字地址的奇怪情况。ap_get_server_version()ap_get_server_description()。生成输出时,应该由ServerTokens配置信息量,请使用
ap_get_server_banner()。ap_graceful_stop_signalled()ap_mpm_query(AP_MPMQ_MPM_STATE)为对状态的调用并检查状态AP_MPMQ_STOPPING。ap_max_daemons_limit,ap_my_generation和ap_threads_per_childap_mpm_query()查询代码
AP_MPMQ_MAX_DAEMON_USED,AP_MPMQ_GENERATION和AP_MPMQ_MAX_THREADS。ap_mpm_query()ap_requires()Require配置提供了更好的基础
结构。使用来为每个受支持的实体注册一个身份验证提供程序功能
ap_register_auth_provider()。在Require
处理过程中将根据需要调用该函数。(有关详细示例,请咨询捆绑的模块。)ap_server_conf->process->pool
用户数据ap_state_query(AP_SQ_MAIN_STATE)。ap_retained_data_create()和
ap_retained_data_get()。apr_global_mutex_create(),
apr_proc_mutex_create()ap_mutex_register(),
ap_global_mutex_create()和
ap_proc_mutex_create(); 这些允许您使用Mutex指令配置互斥体;您还可以在模块中删除此类互斥锁的任何配置机制
CORE_PRIVATEdav_new_error()
和 dav_new_error_tag()errno包含描述故障的信息。现在,apr_status_t必须提供一个参数。如果没有此类错误信息,则传递0 / APR_SUCCESS,否则传递一个有效值
apr_status_t。mpm_default.h,DEFAULT_LOCKFILE,
DEFAULT_THREAD_LIMIT,DEFAULT_PIDLOG,等。DEFAULT_PIDLOG
和DEFAULT_REL_RUNTIMEDIR现在可以通过普遍适用ap_config.h。unixd_configunixd_setup_child()conn_rec->remote_ip 和
conn_rec->remote_addrrequest_rec->useragent_ip与服务器分开,请使用和
request_rec->useragent_addr。conn_rec->client_ip和
conn_rec->client_addr。ap_unixd_config.suexec_enabled为0,则还记录新字段的值suexec_disabled_reason,其中包含不可用原因的说明。ExtendedStatus必须将设置为On,这又需要加载mod_status。在2.4中,只需在预配置挂钩中将设置ap_extended_status为1,即可使用扩展状态数据。ap_args_to_table()会有所帮助。ap_parse_form_data()。Content-Length
并Transfer-Encoding查看是否指定了正文ap_request_has_body()。ap_pool_cleanup_set_null()。ap_runtime_dir_relative()以便遵循DEFAULT_REL_RUNTIMEDIR编译设置或
DefaultRuntimeDir指令对此类文件位置的全局配置
。 Apache httpd 2.4.2及更高版本。可用语言: zh