nginx学习笔记

  • 2018-09-24
  • 174

变量

自定义变量

set $a 123;
set $b “$a 456”;
set $c “{$b}789”

自定义变量在配置被加载时创建,执行时才被赋值。定义全局有效,甚至可以跨vhost,但值仅在内部跳转间有效。详见

常用内置变量

$request
$request_uri
$uri
$args
$arg_xxx
$header_xxx
$cookie_xxx
更多。。。

!!!任何时候都不应该去覆盖内置变量,有些内置变量被覆盖会导致报错甚至进程崩溃。

map

对于配置CORS的域名白名单,使用map是比if更好的选择,毕竟If Is Evil

map只能写于http模块,但不用担心访问任何location都会计算map,nginx的ngx_map模块实现了只有在该用户变量被实际读取时才会执行,也就是惰性求值。更多参考

# $http_origin是自变量,而$cors_header是因变量
map $http_origin $cors_header {
    default "";
    "~^https?://(localhost|www\.abc\.com" "$http_origin";
}

server {
    ...
    location / {
        add_header Access-Control-Allow-Origin $cors_header;
        try_files $uri @other_location; # This try_files is working
    }
    ...
 }

rewrite

server中的rewrite break和last没什么区别,都会去匹配location,所以没必要用last再发起新的请求,可以留空,以下针对location中的rewrite:

last

用重写后的uri重新去匹配location,默认10次匹配不到报500错误

break

终止rewrite阶段,执行后续的其它阶段,对比last,不会重新去匹配location

redirect

302临时重定向

permanent

301永久重定向

if

由于nginx中的配置是分阶段执行的,而非一般编程语言中的线性执行,所以执行顺序看上去会有些怪异,再加上nginx内部对于if处理的一些机制,让初学者很是不解。看文章:How nginx “location if” works