未完待续:


有几个阶段是特例,它不调用挂载地任何的handler,也就是你就不用挂载到这几个阶段了

NGX_HTTP_FIND_CONFIG_PHASE
 NGX_HTTP_POST_ACCESS_PHASE
 NGX_HTTP_POST_REWRITE_PHASE
 NGX_HTTP_TRY_FILES_PHASE


 只有下面这几个phase会有多个handler,剩余的都是只有一个handler的
NGX_HTTP_POST_READ_PHASE   
 NGX_HTTP_SERVER_REWRITE_PHASE,  
 NGX_HTTP_REWRITE_PHASE,  
 NGX_HTTP_PREACCESS_PHASE,  
 NGX_HTTP_ACCESS_PHASE,  
 NGX_HTTP_CONTENT_PHASE,  
 NGX_HTTP_LOG_PHASE
NGX_HTTP_POST_READ_PHASE
 checker: 

 ngx_http_core_generic_phase 

 handler: 

 ngx_http_realip_handler 




 NGX_HTTP_SERVER_REWRITE_PHASE: 

 checker: 

 ngx_http_core_rewrite_phase     

 handler: 

ngx_http_rewrite_handler 

 sever区块中如果有包含rewrite规则,则会最先执行,而且只会执行一次, 然后再判断命中 

 哪个location的配置,再去执行该location中的rewrite, 当该location中的rewrite执行完 

 毕时,rewrite并不会停止,而是根据rewrite过的URL再次判断location并执行其中的配置.  

 那么,这里就存在一个问题,如果rewrite写的不正确的话,是会在location区块间造成无限 

 循环的.所以nginx才会加一个最多重试10次的上限. 


 NGX_HTTP_FIND_CONFIG_PHASE: 

ngx_http_core_find_config_phase 

这是find config phase的checker,用于根据uri查找对应的location,nginx中location的处
理是相当复杂的,这里关注于phase handler的处理流程.find config phase只有一
 个phase handler,并且它没有相应的handler回调函数,完成的只是根据uri匹配到location之
 后,将location的loc_conf赋值给request,并且根据loc_conf对request进行一些处理.所有
 的由静态字符串标识的location被称作static location,由正则表达式表示的location成
 为regex location.所有的static location被组织成二叉树,以便于查找.在static location
 匹配失败后,会进行regex location匹配.这个过程正好描述了nginx中location的匹配规则.

 find config的checker可能会被执行多次,当rewrite成功后,会修改uri参数,需要重新匹
  配location.这就是find_config_index存在的必要,它用于初始化post rewrite phase handler
  的next字段,当uri被修改后会重新跳至find config phase执行.
 

NGX_HTTP_REWRITE_PHASE: 

 checker: 

 ngx_http_core_rewrite_phase 

 handler: 

ngx_http_rewrite_handler 

sever区块中如果有包含rewrite规则,则会最先执行,而且只会执行一次, 然后再判断命中
 哪个location的配置,再去执行该location中的rewrite, 当该location中的rewrite执行完
 毕时,rewrite并不会停止,而是根据rewrite过的URL再次判断location并执行其中的配置. 
 那么,这里就存在一个问题,如果rewrite写的不正确的话,是会在location区块间造成无限
 循环的.所以nginx才会加一个最多重试10次的上限.

 

NGX_HTTP_POST_REWRITE_PHASE: 

 checker: 

ngx_http_core_post_rewrite_phase 

 这是post rewrite phase的checker,用于对rewrite和server rewrite phase进行收尾工作. 

 request中有两个字段与重写相关: 

 uri_changed:uri是否被重写. 

 uri_changes:uri被重写的次数,初始值为11,所以只能重写10次. 

 server rewrite和rewrite的handler会修改这两个变量,实现重写.这个checker就是根据 

 uri_changed判断是否进入find config phase,然后再根据uri_changes做一些校验 


 NGX_HTTP_PREACCESS_PHASE: 

 checker: 

 ngx_http_core_generic_phase 

 handler: 

 ngx_http_degradation_handler 

 ngx_http_realip_handler 

 ngx_http_limit_req_handler 

 ngx_http_limit_conn_handler 



NGX_HTTP_ACCESS_PHASE: 

 checker: 

 ngx_http_core_access_phase 

handler:
ngx_http_access_handler
用于检查IP地址是否可以访问
 

ngx_http_auth_basic_handler
用于验证用户名和密码

 


NGX_HTTP_POST_ACCESS_PHASE: 

 checker: 

ngx_http_core_post_access_phase 

这个是post access phase的checker,用于对access phase做收尾处理. 在ngx_http_init_phase_handlers中只有当use_access为1时这个phase才会有handler, 也就是说只有在access phase注册了handler时这个phase才会添加到请求处理流程里.post access handler完成的工作很简单,就是根据access_code做些出继续处理下个phase还是终止请求

 
NGX_HTTP_TRY_FILES_PHASE: 

 checker: 

ngx_http_core_try_files_phase 

try_files 用于搜索指定目录下的N个文件,如果找不到fileN,则调用fallback中指定的位置来处理请求.
语法: try_files file1 [file2 ... filen] fallback
 默认值: 无
 作用域: location
 这个指令的作用就是可接收多个路径作为参数,当前一个路径的资源无法找到,则自动查找下
 一个路径,如当请求的静态资源不存在,就将请求fallback指定位置到后台服务器上进行动态处理.
 简单的例子:
 location / {
          try_files index.html index.htm @fallback;
        }
 location @fallback {
          root /var/www/error;
          index index.html;
        } 

NGX_HTTP_CONTENT_PHASE: 

 checker: 

 ngx_http_core_content_phase 

 handler: 

ngx_http_random_index_handler
在uri指定的目录下随机找一个文件: 将目录下面的文件名都保存到一个数组中,然后从中随机选择一个文件名,将文件名拷贝到uri中

ngx_http_index_handler
根据index的配置,按顺序查找相应的index是否存在,查到就采用internal redirect

 ngx_http_autoindex_handler 

 ngx_http_dav_handler 

 ngx_http_gzip_static_handler 

 ngx_http_static_handler 



 NGX_HTTP_LOG_PHASE: 

 checker: 

 ngx_http_core_generic_phase 

 handler: 

 ngx_http_log_handler