网站建设定制开发Nginx Location配置详解

目录


一、语法

Location 是 网站建设定制开发中一个非常核心的配置,关于Location,网站建设定制开发举个简单的配置例子:

server {    listen 80;    server_name 10.0.7.115;    location / {        root /data/app/;        index index.html;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

当访问 http://10.0.7.115:80 的时候,返回的是 /data/app/index.html 文件。

Location具体语法:

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

网站建设定制开发重点看方括号中的 [ = | ~ | ~* | ^~ ],其中 | 网站建设定制开发分隔的内容表示你可能会用到的语法,其中:

  • = 表示精确匹配:
location = /test {    return 200 "hello";}
  • 1
  • 2
  • 3

例如:

/test              ok/test/             not ok/test2             not ok/test/2            not ok
  • 1
  • 2
  • 3
  • 4

  • ~ 表示区分大小写的正则匹配:
location ~ ^/test$ {    [configuration] }
  • 1
  • 2
  • 3

例如:

/test              ok/Test              not ok/test/             not ok/test2             not ok
  • 1
  • 2
  • 3
  • 4

  • ~* 表示不区分大小写的正则匹配:
location ~* ^/test$ {         [configuration] }
  • 1
  • 2
  • 3

例如:

/test               ok/Test               ok/test/              not ok/test2              not ok
  • 1
  • 2
  • 3
  • 4

  • ^~ 表示 uri 以某个字符串开头:
location ^~ /images/ {        [configuration] }
  • 1
  • 2
  • 3

例如:

/images/1.gif        ok
  • 1

  • / 表示通用匹配:
location / {         [configuration] }
  • 1
  • 2
  • 3

例如:

/index.html           ok
  • 1
location /test {    [configuration] }
  • 1
  • 2
  • 3

例如:

/test                 ok/test2                ok/test/                ok
  • 1
  • 2
  • 3

二、匹配顺序

Location的定义分为两种:

  • 前缀字符串(prefix string)

  • 正则表达式(regular expression),具体为前面带 ~* 和 ~ 修饰符

当存在多个 Location 的时候,匹配的顺序为:

  • 检查使用前缀字符串的 locations,在使用前缀字符串的 locations 中选择最长匹配的,并将结果进行储存;

  • 如果符合带有 = 修饰符的URI,则立刻停止匹配

  • 如果符合带有 ^~ 修饰符的URI,则也立刻停止匹配

  • 然后按照定义文件的顺序,检查正则表达式,匹配到就停止

  • 当正则表达式匹配不到的时候,使用之前储存的前缀字符串;

总结:

  • 顺序上

    • 前缀字符串顺序不重要,按照匹配长度来确定

    • 正则表达式按照定义顺序

  • 优先级上

    • = 修饰符最高,^~ 次之,再者是正则,最后是前缀字符串匹配。

我们举几个简单的例子进行说明

请求URI如下:

/document
  • 1

示例一:

配置:

server {    location /doc {        [ configuration A ]     }    location /docu {        [ configuration B ]     }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

匹配结果:

configuration B
  • 1

注:虽然 /doc 也能匹配到,但 在顺序上,前缀字符串顺序不重要,按照匹配长度来确定


示例二:

server {    location ~ ^/doc {        [ configuration A ]     }    location ~ ^/docu {        [ configuration B ]     }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

匹配结果:

configuration A
  • 1

注:虽然 ~ ^/docu 也能匹配到,但 正则表达式则按照定义顺序


示例三:

server {    location ^~ /doc {        [ configuration A ]     }    location ~ ^/docu {        [ configuration B ]     }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

匹配结果:

configuration A
  • 1

注:虽然 ~ ^/docu 也能匹配到,但 ^~优先级更高


示例四:

server {    location /document {        [ configuration A ]     }    location ~ ^/docu {        [ configuration B ]     }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

匹配结果:

configuration B
  • 1

注:虽然 /document 也能匹配到,但 正则的优先级更高


三、root 与 alias 的区别

当我们这样设置 root 的时候:

location /i/ {    root /data/w3;}
  • 1
  • 2
  • 3

当请求 /i/top.gif/data/w3/i/top.gif 会被返回。

当我们这样设置 alias 的时候:

location /i/ {    alias /data/w3/images/;}
  • 1
  • 2
  • 3

当请求 /i/top.gif/data/w3/images/top.gif 会被返回。


两者的区别:

  • root 是直接拼接 root + location

  • alias 是用 alias 替换 location


四、server 和 location 中的 root

server 和 location 中都可以使用 root,举个例子:

server {    listen 80;    server_name 10.0.7.115;        root /data/app/;        location / {          root /data/web/;          index index.html;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

如果两者都出现,是怎样的优先级呢?

简单的来说,就是 就近原则,如果 location 中能匹配到,就是用 location 中的 root 配置,忽略 server 中的 root,当 location 中匹配不到的时候,则使用 server 中的 root 配置。

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发