您的位置:

nginx多个location配置实例及使用方法

一、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指令的用法,仅仅以上实例并不是全部,开发工程师可以根据实际需求进行更多的配置方法。