51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Nginx:配置文件nginx.conf中location代码块详解

前言 {#前言}

在 Nginx 的 nginx.conf 配置文件中,location代码块的作用是匹配对应的用户请求url,并将其映射到服务器的指定目录。

location下的匹配命令 {#location下的匹配命令}

可用的匹配命令及作用 {#可用的匹配命令及作用}

location 中可用的匹配命令有两种:普通字符串和正则表达式。~ 和~* 用于正则表达式,其他前缀和无任何前缀都用于普通字符串。正则表达式会根据匹配顺序,匹配到第一个正则表达式后停止搜索。普通字符串匹配则无视顺序,只会选择最精确的匹配。常用的匹配命令和作用如下:

| 命令 | 作用 | |------|-------------------------------------------------| | ~ | 表示执行一个正则匹配,区分大小写 | | ~* | 表示执行一个正则匹配,不区分大小写 | | ^~ | 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配其他。一般用来匹配目录 | | = | 进行普通字符精确匹配 | | 无前缀 | 用于普通字符串 | | @ | 定义一个命名的location,使用在内部定向时,例如error_page,try_files |

匹配命令优先级 {#匹配命令优先级}

  1. 先匹配精确普通字符串,将最精确的匹配暂时存储;如果没有匹配上,进行普通字符串匹配,若匹配多个,按最长匹配,之后是^~匹配;
  2. 然后按照配置文件中的声明顺序进行正则表达式匹配,只要匹配到一个正则表达式,则停止匹配,取正则表达式为匹配结果;
  3. 如果所有正则表达式都匹配不上,则取1中的结果;
  4. 最后匹配"/",如果普通字符串和正则表达式都匹配不上,则报404 NOT FOUND。
  5. 概括地说,"=" > "完整路径" > "^~" > "/*" > "/"

示例 {#示例}

  1. 只匹配"/"。

    |---------------|--------------------------| | 1 2 3 | location = / { } |

  2. 匹配任何请求,所有URI都是以"/"开始;更长字符匹配或正则表达式匹配会优先。

    |---------------|------------------------| | 1 2 3 | location / { } |

  3. 匹配任何以/Directory/ 开始的请求,并停止匹配其他location。

    |---------------|-------------------------------------| | 1 2 3 | location ^~ /Directory/ { } |

  4. 匹配以gif、jpg、jpeg结尾的请求;但是遇到^~由它处理 。

    |---------------|------------------------------------------| | 1 2 3 | location ~* .(gif|jpg|jpeg)$ { } |

  5. 以/index/开头的请求,如果链接的状态为404。则会匹配到@index_error。

    |---------------------|-----------------------------------------------------------------------------------------| | 1 2 3 4 5 6 | location /index/ { error_page 404 @index_error; } location @index_error { ... } |

常用配置指令:alias、root、proxy_pass {#常用配置指令:alias、root、proxy-pass}

alias {#alias}

alias为别名配置,用于访问文件系统,在匹配到URL后,将URL中 匹配到的字段替换成alias 后边的内容。
示例一:
若 location 配置如下(普通字符串匹配),则请求URL为"/test/file"时,返回文件"/usr/local/file"。

|---------------|------------------------------------------------| | 1 2 3 | location /test/ { alias /usr/local/; } |

示例二:
若 location 配置如下(正则表达式匹配),则请求URL为"/test/love.gif"时,返回文件"/usr/local/test1/love.gif"。
其中 "$1" 表示 location表达式中匹配的第一个参数。

|---------------|-----------------------------------------------------------------------------| | 1 2 3 | location ~* /test/~* .(gif|jpg|jpeg)${ alias /usr/local/test1/$1; } |

root {#root}

根路径配置,用于访问文件系统,在匹配到URI后,指向root配置的路径,并把请求路径附加到其后。
示例:
若 location 配置如下(普通字符串匹配),则请求URL为"/test/file"时,返回文件"/usr/local/test/file"

|---------------|-----------------------------------------------| | 1 2 3 | location /test/ { root /usr/local/; } |

proxy_pass {#proxy-pass}

代理配置,用于代理请求,匹配到URI后,转发请求到proxy_pass配置的URL。
示例:
若 location 配置如下(普通字符串匹配),则请求URL为"/test/hello"时,返回则将请求转发到"http://192.168.1.111:8089/hello"。

|---------------|--------------------------------------------------------------------| | 1 2 3 | location /test/ { proxy_pass http://192.168.1.111:8089/; } |

注:如果proxy_pass配置了"/"则不附加location的URI,没有配置"/",则会附加。

last 和 break关键字的区别 {#last-和-break关键字的区别}

(1)last 和 break 当出现在location 之外时,两者的作用是一致的没有任何差异
(2)last 和 break 当出现在location 内部时:

| 关键字 | 作用 | |-------|----------------------------------------------------------| | last | 使用了last 指令,rewrite 后会跳出location 作用域,重新开始再走一次刚才的行为 | | break | 使用了break 指令,rewrite后不会跳出location 作用域,它的生命也在这个location中终结 |

permanent 和 redirect关键字的区别 {#permanent-和-redirect关键字的区别}

| 关键字 | 作用 | |-----------------------|----------------------| | rewrite ... permanent | 永久性重定向,请求日志中的状态码为301 | | rewrite ... redirect | 临时重定向,请求日志中的状态码为302 |

参考链接:https://blog.csdn.net/lch551218/article/details/104256019


赞(5)
未经允许不得转载:工具盒子 » Nginx:配置文件nginx.conf中location代码块详解