Nginx配置之location块

488 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

location指令的作用是根据用户请求的URI来执行不同的操作,也就是根据用户请求地址匹配location配置块,匹配成功就执行location配置块中定义的相关操作。

匹配URI类型

location [ = | ~ | ~* | ^~ ] /URI {
    # ...
}
  • 空:location /URIlocation后没有参数直接跟着标准URI,表示前缀,代表跟请求中的URI从头开始匹配。
  • =location =/URI,用于标准URI前,要求请求字符串与其精准匹配,成功则立即处理,nginx停止搜索其他匹配
  • ^~:用于标准URI前,并要求一旦匹配到就会立即处理,不再去匹配其他的那些个正则 URI,一般用来匹配目录。
  • ~: 用于正则 URI 前,表示 URI 包含正则表达式,区分大小写。
  • ~*:用于正则 URI 前,表示 URI 包含正则表达式,不区分大小写。

URI匹配顺序

nginx通过两层指令(serverloaction)来匹配请求URI

第一层

使用server指令,通过域名、IP和端口来做第一层匹配,当找到匹配的server后就进入server块中匹配location

第二层

location 的匹配并不完全按照其在配置文件中出现的顺序来匹配,请求 URI 会按如下规则进行匹配:

  1. 先精准匹配 = ,精准匹配成功则会立即停止其他类型匹配;
  2. 没有精准匹配成功时,进行前缀匹配。先查找带有 ^~ 的前缀匹配,带有 ^~ 的前缀匹配成功则立即停止其他类型匹配。再进行普通前缀匹配(不带参数 ^~ )成功则会暂存,继续查找正则匹配;
  3. = ^~ 均未匹配成功前提下,查找正则匹配 ~ ~* 。当同时有多个正则匹配时,按其在配置文件中出现的先后顺序优先匹配,命中则立即停止其他类型匹配;所有正则匹配均未成功时,返回步骤(2)中暂存的普通前缀匹配(不带参数 ^~ )结果;

以上规则优先级从高到低依次为:

location =    # 精准匹配,优先级最高
location ^~   # 带参前缀匹配
location ~    # 正则匹配(区分大小写)
location ~*   # 正则匹配(不区分大小写)
location /a   # 普通前缀匹配,优先级低于带参数前缀匹配。
location /    # 任何没有匹配成功的,都会匹配这里处理,优先级最低

命名location

@ 定义一个命名的 location,@ 定义的 location 名字一般用在内部定向,例如:error_page、try_files 。

命令location中不能再嵌套其它的命名location

# 当尝试访问 url 找不到对应的文件就重定向到我们自定义的命名 location(此处为 custom)
location / {
    try_files $uri $uri/ @custom
}
 
location @custom {
    # ...do something
}

其他参数

  • proxy_pass:用来设置代理服务器的映射地址,可以使用https或者http协议,而且地址可以使用域名、IP以及可选的端口
proxy_pass  http://127.0.0.1:9001/;
  • proxy_cookie_path:用来改变cookie的路径
    • path:要替换的路径
    • replacement:要替换的值
proxy_cookie_path path replacement;
proxy_cookie_path /demo /;
  • proxy_set_header:该指令允许重新定义或添加字段到传递给代理服务器的请求头。该值可以包含文本、变量及其组合。当且仅当当前级别上没有定义 proxy_set_header 指令时,这些指令才从先前的配置级别继承。默认情况下,只重新定义了两个字段:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
  • proxy_redirectnginx proxy_redirect 功能比较强大,其作用是对发送给客户端的 URL 进行修改。如果需要修改从被代理服务器传来的应答头中的LocationRefresh字段,可以用这个指令进行设置。假如被代理服务器返回 Location 字段为:
http://localhost:8000/two/some/uri/

下面指令:

proxy_redirect http://localhost:8000/two/ http://frontend/one/;

Location 字段重写为 http://frontend/one/some/uri/

在代替的字段中可以不写服务器名,这样就使用服务器的基本名称和端口。

proxy_redirect http://localhost:8000/two/ /;
  • proxy_connect_timeout:定义与代理服务器建立连接的超时时间,注意:这个超时时间通常不能超过 75 秒。
  • proxy_read_timeout:定义从代理服务器读取响应的超时时间。超时仅在两次连续读取操作之间设置,而不是针对整个响应的传输。如果代理服务器在此时间内未传输任何内容,则连接将关闭。
  • proxy_send_timeout:设置将请求传输到代理服务器的超时时间。超时仅设置在两次连续的写操作之间,而不是针对整个请求的传输。如果代理服务器在此时间内没有收到任何信息,则连接将关闭。