Nginx的模块化设计使得每一个HTTP模块可以仅专注于完成一个独立的、简单的功能,而一个请求的完整处理过程可以由无数个HTTP模块共同合作完成。这种设计有非常好的简单性、可测试性、可扩展性,然而,当多个http模块流水式地处理同一个请求时,单一的处理顺序是无法满足灵活性需求的,每一个正在处理的HTTP模块很难灵活、有效地指定下一个HTTP处理模块是哪一个。
因此,HTTP框架依据常见的处理流程将处理阶段划分为11个阶段,其中每个处理阶段都可以由任意多个HTTP模块流水式地处理请求。
typedef enum {
//在接收到完整的HTTP头部后处理的HTTP阶段
NGX_HTTP_POST_READ_PHASE = 0,
//在请求的URI与location表达式匹配前,修改请求的URI(重定向),是一个独立的HTTP阶段
NGX_HTTP_SERVER_REWRITE_PHASE,
//根据请求的URI寻找匹配的location表达式,这个阶段只能由
NGX_HTTP_FIND_CONFIG_PHASE,
//在NGX_HTTP_FIND_CONFIG_PHASE阶段寻找到匹配的location之后再修改请求的URI
NGX_HTTP_REWRITE_PHASE,
//这一阶段是用于在rewrite重写URL后,防止错误的nginx.conf配置导致死循环(递归地修改URI)
NGX_HTTP_POST_REWRITE_PHASE,
//表示在处理NGX_HTTP_ACCESS_PHASE阶段觉得请求的访问权限前,HTTP模块可以介入的处理阶段
NGX_HTTP_P