nginx配置中的location

语法
location [=|~|~*|^~] /uri/ {...}

上下文: server

此命令随URL 不同而接受不同的结构. 可以配置使用常规字符串和正则表达式. 若使用正则表达式, 则必须使用~*前缀(选择不区分大小写的匹配) 或~前缀(区分大小写的匹配)

  • = 表示uri 以某个常规字符串开头, 理解为匹配url 路径即可. nginx 不对url 做编码, 因此请求为/static/%20%/aa 可以被规则^~ /static/ /aa (有空格) 匹配到.
  • ~ 表示区分大小写的正则匹配
  • ~* 表示不区分大小写的正则匹配
  • !~!~* 分别为区分大小写不匹配 和 不区分大小写不匹配 的正则
  • / 通用匹配, 任何请求都会匹配到

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

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

例1:

location = / {
    # 规则A
}

location = /login {
    # 规则B
}

location ^~ /static {
    # 规则C
}

location ~ \.(gif|jpg|png|js|css)$ {
    # 规则D
}

location ~* \.png$ {
    # 规则E
}

location !~ \.xhtml$ {
    # 规则F
}

location !~* \.xhtml$ {
    # 规则G
}

location / {
    # 规则H
}

产生效果如下:

  • 访问/ 根目录, 如http://localhost/ 将匹配规则A
  • 访问http://localhost/login 将匹配规则B; http://localhost/register 将匹配规则H
  • 访问http://localhost/static/a.html 将匹配规则C
  • 访问http://localhost/a.png 讲匹配规则D 和规则E, 但规则D 顺序优先, 规则E 不起作用
  • 访问http://localhost/static/c.png 优先匹配到规则C
  • 访问http://localhost/a.PNG 将匹配规则E
  • 访问http://localhost/a.xhtml 不会匹配到规则F 和规则G, http://localhost/a.XHTML 不会匹配到规则G
  • 访问http://localhost/category/id/1111 匹配到规则H, 因为以上规则都不匹配, 这个时候应该是nginx 转发给后端应用服务器, 如FastCGI(php), tomcat(jsp), nginx 作为反向代理服务器存在.

所以实际使用中, 通常有至少三个匹配规则定义, 如下:

# 第一个必选规则 直接匹配网站根, 通过域名访问网站首页比较频繁, 使用这个会加速处理; 这里直接转发给后端应用服务器了, 也可以是一个静态首页
location = / {
    proxy_pass http://tomcat:8080/index
}

# 第二个必选规则 处理静态文件请求, 这是nginx 作为http 服务器的强项. 有如下两种配置模式, 目录匹配或后缀匹配, 任选其一或搭配使用
location ^~ /static/ {
    root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

# 第三个必选规则 通用规则, 用来转发动态请求到后端应用服务器. 非静态文件请求就默认是动态请求. 
location / {
    proxy_pass http://tomcat:8080/
}
Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计