返回首页 - Notes - 2016

OpenResty 学习笔记


变量

变量命名规则和 PHP 一致,前面以美元符打头

变量赋值使用 set,如 set $name 'Ruchee';(外围的引号可以是单引号,也可以是双引号,还可以不写引号)

字符串中可以内插变量,表现和 PHP 一致,且不论是单引号字符串还是双引号字符串,都可以内插,如

set $hello 'Hello $name';

变量内插时,为避免歧义可使用大括号包围,但和 PHP 有些许差异,这里美元符写在大括号外面,如

set $test_str '${name}haha';

可以用 echo 指令输出信息,如

echo 'say hello to $name'

无法直接输出 $,如果需要可以通过 geo 指令来实现,如

geo $dollar {
    default '$';
}

server {
    server 8080;

    location /hello {
        echo 'dollar char: $dollar';
    }
}

变量作用域

使用 set 可以创建变量,且变量的可见范围是整个配置,但每个请求都会有各个变量的独立副本,各个请求中各变量的值并无共享关系

如果使用 echo_execrewrite 指令进行 内部跳转,则可以达到“变量值跨请求传递”的效果(其实因为还是同一个请求,所以在前一个路由中设置的变量值在接下来的路由中依然存在)


内建变量


子请求

使用 echo_location 可以发起子请求,子请求按顺序执行,且各请求中的变量值保持独立

但也不排除部分第三方模块的指令允许 父子请求 共享变量

在子请求中,uriargsarg_xxx 等变量值也是互相独立的

request_method 例外,子请求用这个变量获取到的永远是父请求的请求方法,解决办法是使用 echo_request_method 代替

request_urirequest_method 一样,子请求取到的也是父请求的值,取不到自己真实的值


指令执行顺序

各不同类型的指令、各不同第三方模块的指令,都有可能在不同的阶段执行,具体得看指令或模块的文档

NGINX 处理请求时会经历下面三个阶段

  1. ngx_index:只作用于 URI/ 结尾的请求,由 index 指令执行
  2. ngx_autoindex:只作用于 URI/ 结尾的请求,由 autoindex 指令开启
  3. ngx_static:忽略 URI/ 结尾的请求,执行流程的最后一环

NGINX 全部的 11 个处理阶段

  1. post-read
  2. server-rewrite
  3. find-config
  4. rewrite
  5. post-rewrite
  6. preaccess
  7. access
  8. post-access
  9. try-files
  10. content
  11. log

try_files 指令的前 N-1 个参数,NGINX 只会检查文件系统,而不会去执行 URIlocation 之间的匹配


date:2016-03-03、2016-03-04