# ngx_http_core_module

# server_name

  1. 确切的 server_name 匹配

  2. 以 * 通配符开始的最长字符串

  3. 以 * 通配符结束的最长字符串

    注意:通配符名字只可以在名字的起始处或结尾处包含一个星号,并且星号与其他字符之间用点分隔。所以,www.*.example.orgw*.example.org 都是非法的。

    有一种形如 ".example.org" 的特殊通配符,它可以既匹配确切的名字 "example.org",又可以匹配一般的通配符名字 "*.example.org"。

  4. 匹配正则表达式

    为了使用正则表达式,虚拟主机名必须以 波浪线“~” 起始否则该名字会被认为是个确切的名字。

    ~^([^.]+)\.example\.com

    *.example.com

# location

  • 匹配 URI 类型,有四种参数可选,当然也可以不带参数。
  • 命名 location,用 @ 来标识,类似于定义 goto 语句块。
location [ = | ~ | ~* | ^~ ] /URI {}
location @/name/ {}
符号 含义
location 后没有参数直接跟着 标准 URI,表示前缀匹配,代表跟请求中的 URI 从头开始匹配。
= 用于标准 URI 前,要求请求字符串与其精准匹配,成功则立即处理,nginx 停止搜索其他匹配。
^~ 用于标准 URI 前,并要求一旦匹配到就会立即处理,不再去匹配其他的那些个正则 URI,一般用来匹配目录。
~ 用于正则 URI 前,表示 URI 包含正则表达式, 区分大小写。
~* 用于正则 URI 前, 表示 URI 包含正则表达式, 不区分大小写。
@ @ 定义一个命名的 location,@ 定义的 locaiton 名字一般用在内部定向,例如 error_page, try_files 命令中。它的功能类似于编程中的 goto。

多个 location 配置的情况下匹配顺序为:

  • 首先匹配 =
  • 其次匹配 ^~
  • 其次是按文件中顺序的正则匹配
  • 最后是交给 /
  • 当有匹配成功时候,停止匹配,按当前匹配规则处理请求