一、location指令基本概念
在Nginx中,location指令用于匹配客户端请求的URL,并根据匹配规则进行转发或请求处理。其基本语法如下:
location [=|~|~*|^~] uri { }
location / { }
location ~ /\.ht { deny all; }
其中location后面紧跟匹配模式,可以是常规字符串、正则表达式、以及4种转发匹配模式(=、~、~*、^~)。
在正常情况下,Nginx会根据请求URI匹配location指令中 uri 字符串作为前缀的模式。例如:
location /abc { # 匹配以 /abc 开头的URI }
还有一些特殊的匹配模式,如:
- = 表示严格匹配
- ~ 表示正则表达式模式(区分大小写)
- ~* 表示正则表达式模式(不区分大小写)
- ^~ 表示普通字符串匹配(如果该字符串在正则表达式匹配之前被匹配,则停止对后面的正则表达式的匹配)
二、多个location的配置实例
1. 独立的多个location
在同一服务器下存在多个location的时候,需要用 server 配置块区分不同的虚拟主机,如下例子:
server {
listen 80;
server_name www.example.com;
location / {
root /data/www;
index index.html;
}
location /images/ {
root /data;
}
}
上述配置中,“location /”表示默认处理请求,访问 / 时,会使用root指令中的目录,查找不存在会按照index指令中的顺序查找index文件。
而“location /images/”表示对以 /images/ 开头的 URL 进行匹配,会使用root指令中的目录。
2. 重写 URL:多级目录
在配置 url 重写时,常见的情况是匹配url的前几个字符,然后将剩下的字符串作为参数传递到后端的处理程序中。这种情况下,就需要使用正则表达式。
location ~ ^/users/(.*)$ {
proxy_pass http://localhost:8000/$1;
}
上述配置将匹配所有以 /users/ 开头的 URL,将 URL 的剩余部分的作为参数,传递到后端的http://localhost:8000/ 中进行处理。
3. RESTful API:根据请求方法匹配 location
在实际业务场景中,API服务经常是采用 RESTful 方式来编写的,这个时候可以采用请求方法进行匹配并转发请求。如下例子:
location /something {
if ($request_method = 'POST') {
proxy_pass http://backend;
}
if ($request_method = 'GET') {
proxy_pass http://frontend;
}
}
上述配置中,如果是POST方法,则转发到http://backend,否则转发到http://frontend。
4. 静态文件和缓存控制
在使用Nginx作为反向代理服务器的场景下,使用location可以对静态文件的请求进行处理,如下例子:
location /images/ {
root /data/www;
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
}
上述配置中,假设root目录中存在 /data/www/images/icon.png 文件,当客户端请求URL “www.example.com/images/icon.png” 时,Nginx将会在/data/www/images/ 路径下寻找icon.png文件,然后返回给客户端。同时,添加了Cache-Control和Pragma头部字段,以更好地控制缓存。
三、小结
通过以上实例,相信大家已经了解了Nginx的location指令的用法,仅仅以上实例并不是全部,开发工程师可以根据实际需求进行更多的配置方法。