由于server中的location配置是前端接触最多的配置项,location指令的功能是用来匹配不同的url请求,进而对请求做不同的处理和响应。所有本文将深入探讨Nginx的location指令的用法,包括基础语法、匹配规则、优先级等,并通过实际配置案例进行讲解。
一、Nginx Location简介
在Nginx中,location是用于匹配请求URI的指令,用于定义如何响应不同URL的请求。它是Nginx配置中最常用且重要的指令之一。通过Location指令,我们可以实现URL路由、负载均衡、静态文件服务等功能。
二、Location语法与匹配规则
- 基础语法
location指令的基本语法如下:
location [匹配方式] /uri/ {
# 处理规则
}
其中,匹配方式
可以是以下之一:
=
:表示精确匹配;~
:表示区分大小写的正则匹配;~*
:表示不区分大小写的正则匹配;^~
:表示以指定字符串开头的URI匹配;@
:表示定义一个命名的location,用于内部重定向。
- 匹配规则优先级
Nginx会按照特定的优先级顺序来匹配location:
- 精确匹配(
=
); - 最长字符串匹配(
^~
); - 正则表达式匹配(
~
、~*
); - 默认匹配(没有匹配到以上规则的)。
三、配置案例
下面通过几个实际配置案例来说明Nginx Location的用法。
1. location 匹配所有请求
在下面的示例中,前缀location /将匹配所有请求,但如果没有找到匹配,将作为最后的手段使用。
location / {
...
}
2. location 精确URL匹配
NGINX总是首先尝试匹配最特定的前缀位置。因此,以下位置块中的等号强制与请求的路径进行精确匹配,然后停止搜索更多匹配。
location = /images {
...
}
上述位置块将与URL https://domain.com/images匹配,但URL https://domain.com/images/index.html或https://domain.com/images/将不匹配。
3. 目录匹配
下面的位置块将匹配以/images/开头的任何请求,但继续为所请求的URI搜索更具体的块。因此,如果NGINX没有找到任何更具体的匹配,位置块将被选中。
location /images/ {
...
}
4. location RegEx示例
以下位置块中的修饰符^~将导致区分大小写的正则表达式匹配。因此,URI /images或/images/logo.png将被匹配,但一旦找到匹配就停止搜索。
location ^~ /images {
...
...
}
5. image/css/js文件类型匹配
下一个位置块中的修饰符~*匹配任何以png, ico, gif, jpg, jpeg, css或js结尾的请求(不区分大小写)。但是,对/images/文件夹的任何请求都将由前一个位置块提供服务。
location ~* .(png|ico|gif|jpg|jpeg|css|js)$ {
...
...
}
6. RegEx区分大小写匹配
以下位置块中的修饰符~会导致大小写敏感的正则表达式匹配,但不会停止搜索更好的匹配。
location ~ /images {
...
...
}
7. RegEx不区分大小写匹配示例
以下位置块中的修饰符~*将导致不区分大小写的正则表达式匹配,但搜索不会在此停止以寻找更好的匹配。
location ~* /images {
...
...
}
四、我常用的配置
1. 配置接口的代理
location ^~ /api/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://X.X.X.X:port/;
#proxy_pass http://X.X.X.X:port/api/;
}
location ^~ /map/ {
proxy_pass https://X.X.X.X:port/;
proxy_redirect default;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
}
2. 配置资源缓存时间
location ~ .*\.(jpg|png|gif|swf|woff|woff2|eot|svg|ttf|otf|mp3|mp4|m4a|aac|txt)$ {
expires 7d;
# 如果不希望缓存
#expires -1;
}
3. 配置前端项目的二级路径
location /web/ {
alias F:/nginxDist/manage/web/;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /web2/ {
alias F:/nginxDist/manage/web2/;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /web3/ {
alias F:/nginxDist/manage/web3/;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
4. 配置前端项目的路径
location / {
alias F:/nginxDist/reactApp/dist/;
index index.html index.htm;
try_files $uri $uri/ /index.html;
if ($request_filename ~ .*\.(htm|html)$) {
add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
}
if ($request_filename ~ .*\.(js|css|jpg|jpeg|gif|png|ico)$) {
expires 7d;
}
}
五、总结与注意事项
通过本文的介绍,我们详细了解了Nginx Location的用法与配置方式。在实际应用中,需要根据具体需求合理设计Location的匹配规则,以确保请求能够正确地被处理和转发。同时,也需要注意Nginx的配置文件的语法和格式,避免因为配置错误导致服务无法正常运行。