nginx 学习笔记

location

location 文档

syntax: location [ ~ | ~* | ^~ | = ]  /uri/ { ... }
  1. 无前缀

    • literal string 匹配
    • 匹配成功后仍会进行后续匹配, 如果后续存在优先级更高的匹配, 则会采用优先级高的匹配, 不存在才会采用该匹配
    • 匹配优先级见官网文档 ngx_http_core_module #location
  2. ~~*

    • 正则匹配
    • 匹配成功后仍会进行后续匹配, 如果后续存在优先级更高的匹配, 则会采用优先级高的匹配, 不存在才会采用该匹配
    • ~: 大小写敏感
    • ~*: 大小写敏感
  3. ^~

    • 区别于 ~, 匹配成功则立即终止匹配
  4. =

    • 仅匹配 exact query
    • 匹配成功则立即终止匹配

alias

alias 文档

location /i/ {
  alias  /path/to/images/;
}

# 剩余 location 直接拼接到 alias
# request /i/top.gif
# return  /path/to/images/top.gif

alias 指令不能用在指定正则的 location 中; 指定正则的 location 中需要使用 rewrite + root;

root

root 文档

location /i/ {
  root /path/to/images;
}

# 整个 location 直接拼接到 root
# request /i/top.gif
# return  /path/to/images/i/top.gif

rewrite

rewrite 文档

  1. rewrite 位于 server 下时, 可以使用 last 标记来中止 rewrite;
    server {
      # ...
      rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  last;
      rewrite  ^(/download/.*)/audio/(.*)\..*$  $1/mp3/$2.ra   last;
      return  403;
      # ...
    }
    
  2. rewrite 位于 location 下时, 需要把 last 换成 break;
    location /download/ {
      rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  break;
      rewrite  ^(/download/.*)/audio/(.*)\..*$  $1/mp3/$2.ra   break;
      return  403;
    }
    
  3. replacement 包含新的 arguments 时, 需要在结尾添加 ?, 因为原 arguments 会直接拼接到 replacement 后面
    rewrite ^/users/(.*)$ /show?user=$1? last;
    

proxy_pass

proxy_pass 文档

  1. proxy_pass 最后有 "/", 则将 剩余 location 拼接到 proxy_pass
  2. proxy_pass 最后没有 "/":
    • 如果结尾是 host, 则将 整个 location 拼接到 proxy_pass
    • 如果结尾是 path, 则将 剩余 location 拼接到 proxy_pass

try_files

try_files 文档

location / {
  try_files index.html index.htm @whatever_fallback;
}

location @whatever_fallback {
  root /var/www/error;
  index index.html;
}
  1. @whatever_fallback 是具名location(named location)
  2. 尝试检测指定文件是否存在, 返回第一个存在的文件;
  3. 如果都不存在, 将会调用 @fallback location;

部分内置变量

部分内置变量 文档

  1. $args(等同于 $query_string)

    请求参数

  2. $request_filename

    基于 root / aliasrequest URI 的当前 file path

  3. $request_uri

    包括 arguments 的完整初始 uri(complete initial URI)

  4. $uri

    当前 uri 不同于initial uri, 因为可能经过了内部重定向

tips

  1. It is important to know that nginx does the comparison against decoded URIs. For example, if you wish to match /images/%20/test, then you must use /images/ /test to determine the location.

如非特别声明,本站作品均为原创,遵循【自由转载-保持署名-非商用-非衍生 创意共享 3.0 许可证】。

对于转载作品,如需二次转载,请遵循原作许可。