在 nginx 中,要实现按 url 后缀分发不同后端,核心做法是利用 location 块的正则匹配功能,根据请求 uri 的结尾特征将流量转发至不同的 proxy_pass 目标。具体而言,可以使用正则表达式定位以特定后缀(如 .html、.json)结尾的路径,并在对应的 location 中配置相应的后端地址,nginx 会按照优先级顺序匹配并执行转发。

如何配置 location 实现精确的后缀匹配
通过定义带有正则前缀的 location 块,可以精准捕获以指定后缀结尾的请求。例如,使用 ~ \.html$ 来匹配所有以 .html 结尾的 URL,并将其代理到静态资源服务器;而使用 ~ \.json$ 匹配 API 数据请求并转发至应用服务器。这种配置方式依赖于 Nginx 的正则引擎,确保只有符合后缀条件的请求才会进入特定的处理逻辑。

server {
listen 80;
server_name example.com;
# 匹配以 .html 结尾的请求,转发到静态服务器
location ~ \.html$ {
proxy_pass http://static_backend;
proxy_set_header Host $host;
}
# 匹配以 .json 结尾的请求,转发到 API 服务器
location ~ \.json$ {
proxy_pass http://api_backend;
proxy_set_header Host $host;
}
# 默认后端
location / {
proxy_pass http://default_backend;
}
}
上述配置中,static_backend 和 api_backend 需在 upstream 或 DNS 中正确解析。当请求 /page.html 时,Nginx 优先匹配第一个正则规则,将请求发送至静态服务器;若请求 /data.json,则匹配第二个规则,转发至 API 服务器。其他未匹配后缀的请求将落入默认的 location / 块。
如何处理非标准后缀或动态路径的分发
对于非标准后缀或需要更复杂逻辑的场景,可以通过扩展正则表达式或使用变量动态构建后端地址来实现。例如,若需根据 URL 中的特定参数或路径段决定后端,可结合 map 指令或 if 语句进行判断。但需注意,if 在 location 中的使用需谨慎,以避免意外行为。推荐使用 map 指令预处理请求特征,再结合 proxy_pass 实现灵活分发。

map $uri $backend {
~\.html$ static_backend;
~\.json$ api_backend;
default default_backend;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://$backend;
proxy_set_header Host $host;
}
}
在此配置中,map 指令根据 $uri 的值动态设置 $backend 变量,随后在 location / 中使用该变量作为 proxy_pass 的目标。这种方式避免了多个 location 块的冗余,同时保持了配置的简洁性。当请求 /page.html 时,$backend 被设置为 static_backend,请求随之转发至对应后端;类似地,/data.json 将触发 api_backend。此方法适用于后缀规则较多或需集中管理的场景。
基于 proxy_pass 转发后如何处理后端返回的响应头
当 Nginx 将请求转发至不同后端后,后端返回的响应头可能包含与原始请求不兼容的信息,例如 Set-Cookie 或 Location 重定向头。为确保客户端正确接收响应,需在 location 块中调整响应头处理策略。例如,使用 proxy_hide_header 隐藏敏感头信息,或通过 proxy_set_header 修改请求头以适配后端要求。此外,若后端返回重定向 URL,需确保其指向正确的域名或路径,避免客户端跳转失败。











