开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
location指令的作用是根据用户请求的URI来执行不同的操作,也就是根据用户请求地址匹配location配置块,匹配成功就执行location配置块中定义的相关操作。
匹配URI类型
location [ = | ~ | ~* | ^~ ] /URI {
# ...
}
- 空:
location /URI,location后没有参数直接跟着标准URI,表示前缀,代表跟请求中的URI从头开始匹配。 =:location =/URI,用于标准URI前,要求请求字符串与其精准匹配,成功则立即处理,nginx停止搜索其他匹配^~:用于标准URI前,并要求一旦匹配到就会立即处理,不再去匹配其他的那些个正则 URI,一般用来匹配目录。~: 用于正则 URI 前,表示 URI 包含正则表达式,区分大小写。~*:用于正则 URI 前,表示 URI 包含正则表达式,不区分大小写。
URI匹配顺序
nginx通过两层指令(server、loaction)来匹配请求URI。
第一层:
使用server指令,通过域名、IP和端口来做第一层匹配,当找到匹配的server后就进入server块中匹配location。
第二层:
location 的匹配并不完全按照其在配置文件中出现的顺序来匹配,请求 URI 会按如下规则进行匹配:
- 先精准匹配
=,精准匹配成功则会立即停止其他类型匹配; - 没有精准匹配成功时,进行前缀匹配。先查找带有
^~的前缀匹配,带有^~的前缀匹配成功则立即停止其他类型匹配。再进行普通前缀匹配(不带参数^~)成功则会暂存,继续查找正则匹配; =和^~均未匹配成功前提下,查找正则匹配~和~*。当同时有多个正则匹配时,按其在配置文件中出现的先后顺序优先匹配,命中则立即停止其他类型匹配;所有正则匹配均未成功时,返回步骤(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_redirect:nginx的proxy_redirect功能比较强大,其作用是对发送给客户端的 URL 进行修改。如果需要修改从被代理服务器传来的应答头中的Location和Refresh字段,可以用这个指令进行设置。假如被代理服务器返回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:设置将请求传输到代理服务器的超时时间。超时仅设置在两次连续的写操作之间,而不是针对整个请求的传输。如果代理服务器在此时间内没有收到任何信息,则连接将关闭。