未完待续: 有几个阶段是特例,它不调用挂载地任何的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_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:这是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执行.
sever区块中如果有包含rewrite规则,则会最先执行,而且只会执行一次, 然后再判断命中
哪个location的配置,再去执行该location中的rewrite, 当该location中的rewrite执行完
毕时,rewrite并不会停止,而是根据rewrite过的URL再次判断location并执行其中的配置.
那么,这里就存在一个问题,如果rewrite写的不正确的话,是会在location区块间造成无限
循环的.所以nginx才会加一个最多重试10次的上限.
handler:
ngx_http_access_handler
用于检查IP地址是否可以访问
ngx_http_auth_basic_handler
用于验证用户名和密码
这个是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还是终止请求
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_random_index_handler
在uri指定的目录下随机找一个文件: 将目录下面的文件名都保存到一个数组中,然后从中随机选择一个文件名,将文件名拷贝到uri中
ngx_http_index_handler
根据index的配置,按顺序查找相应的index是否存在,查到就采用internal redirect