Apache2 中 php 两种设置的异同说明

  Apache2开始引入了Hook方式,对应的在PHP中也提供了apache2handler这种sapi。和我之前介绍过的PHP lifecycle不同,这种情况下的PHP,通过注册handler钩子,从而可以在handler hook阶段有机会处理请求,通过判断请求的handler,来确定是否需要处理,如果需要就会调用自身的处理器。

  那么,这种情况下也就有了多种配置方法,主要考虑如下俩种方式(第二种可以有多种变种):

第一种:

AddType application/x-httpd-php .php

第二种:

<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>

  首先来说,这俩中方式的起作用的时刻不同,对于第一种方式来说,他是在type_check钩子阶段起作用的,也就是在apache2src/modules/http/mod_mime.c中,通过注册type_checker钩子,加入find_ct(content_type),在find_ct中,通过配置文件中的mime映射,或者是通过addType指令增加的映射,根据文件的扩展来填充请求中的handler字段:

  而对于第二种方式,是在fixup钩子阶段,通过注册fixups钩子阶段加入core_override_type(apache2src/server/core.c)函数,来将目录级的配置指令生效。

  而fixups钩子是晚于type_checker钩子的,也是handler钩子之前最后的一个可以利用的钩子. 所以如果同时采用1,2俩种方式,那么第二种方式会覆盖第一种方式设置的handler。

  其次,俩种方式依赖的数据结构不同,第一种方式依赖的是一个全局的mime对照表extension_mappings,这个表由mime配置文件和AddType指令而来。

  而对于第二种方式,它是根据配置文件构造的dir_config而来:

  core_dir_config *conf =
        (core_dir_config *)ap_get_module_config(r->per_dir_config,
                                                &core_module);
 
    /* Check for overrides with ForceType / SetHandler
*/
    if (conf->mime_type && strcmp(conf->mime_type,"none"))
        ap_set_content_type(r,(char*) conf->mime_type);
 
    if (conf->handler && strcmp(conf->handler,"none"))
        r->handler = conf->handler;

Apache v2.2.22 for Windows下载

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/10918.html