跳到主要内容

Nginx 映射

Nginx映射(Map)是一种强大的功能,允许你根据变量值动态地设置其他变量的值。它通常用于URL重写、请求路由、条件重定向等场景。通过映射,你可以更灵活地处理复杂的请求逻辑,而无需编写冗长的条件语句。

什么是Nginx映射?

Nginx映射是通过map指令实现的。map指令允许你定义一个键值对列表,并根据输入的变量值动态地设置另一个变量的值。它的语法如下:

nginx
map $variable_to_check $new_variable {
value1 result1;
value2 result2;
default default_result;
}
  • $variable_to_check:这是你要检查的变量。
  • $new_variable:这是根据检查结果设置的新变量。
  • value1, value2:这些是可能的输入值。
  • result1, result2:这些是对应的输出值。
  • default:如果输入值不匹配任何键,则使用默认值。

基本示例

假设我们有一个简单的需求:根据用户的语言偏好设置不同的欢迎消息。我们可以使用map指令来实现这一点。

nginx
http {
map $http_accept_language $welcome_message {
~*en "Welcome!";
~*fr "Bienvenue!";
~*es "¡Bienvenido!";
default "Welcome!";
}

server {
listen 80;
server_name example.com;

location / {
return 200 $welcome_message;
}
}
}

在这个例子中:

  • $http_accept_language是HTTP请求头中的Accept-Language字段。
  • $welcome_message是根据用户语言偏好设置的欢迎消息。
  • ~*表示不区分大小写的正则表达式匹配。

如果用户的语言偏好是英语(en),Nginx会返回"Welcome!";如果是法语(fr),则返回"Bienvenue!",以此类推。

实际应用场景

1. URL重写

假设你有一个旧的URL结构,现在需要将其重定向到新的URL结构。你可以使用map指令来简化这个过程。

nginx
http {
map $request_uri $new_uri {
/old-page /new-page;
/old-blog /blog;
default $request_uri;
}

server {
listen 80;
server_name example.com;

location / {
rewrite ^ $new_uri permanent;
}
}
}

在这个例子中:

  • $request_uri是请求的URI。
  • $new_uri是根据旧URI映射到的新URI。
  • 如果请求的URI是/old-page,它会被重定向到/new-page

2. 动态代理

假设你有一个多租户系统,每个租户有不同的子域名。你可以使用map指令来动态地将请求代理到不同的后端服务器。

nginx
http {
map $host $backend {
tenant1.example.com 127.0.0.1:8001;
tenant2.example.com 127.0.0.1:8002;
default 127.0.0.1:8000;
}

server {
listen 80;
server_name example.com;

location / {
proxy_pass http://$backend;
}
}
}

在这个例子中:

  • $host是请求的主机名。
  • $backend是根据主机名映射到的后端服务器地址。
  • 如果请求的主机名是tenant1.example.com,请求会被代理到127.0.0.1:8001

总结

Nginx映射是一个非常强大的工具,可以帮助你简化复杂的请求处理逻辑。通过map指令,你可以根据变量值动态地设置其他变量的值,从而实现URL重写、动态代理等功能。希望本教程能帮助你理解并掌握Nginx映射的基本用法。

附加资源

练习

  1. 尝试使用map指令实现一个简单的URL重写功能,将/about-us重定向到/about
  2. 使用map指令实现一个动态代理功能,根据请求的主机名将请求代理到不同的后端服务器。
提示

在编写Nginx配置时,记得在修改后重新加载Nginx配置以应用更改:sudo nginx -s reload