You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx正则捕获路径后代理转发失败,如何实现正确转发?

解决方案

核心问题分析

  1. DNS解析失败:你在Nginx配置里用了animations-server作为目标服务名,但Docker Compose中定义的服务名是animations,内部DNS只能解析服务名对应的域名;同时,当proxy_pass包含变量(如正则捕获的$1)时,Nginx需要显式指定DNS resolver才能解析域名。
  2. 路径转发错误:需要去掉请求URL中的/animations/前缀,才能让后端服务正确匹配到/www/media/下的文件。

正确配置方案

方案一:正则匹配+变量转发

修改443端口的server块配置:

http {
    server {
        listen 80;
        server_name domain.co.uk;
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        server_name domain.co.uk;

        ssl_certificate /etc/nginx/cert.pem;
        ssl_certificate_key /etc/nginx/key.pem;

        resolver 127.0.0.11; # Docker内部DNS服务地址

        location ~ ^/animations/(.*)$ {
            proxy_pass http://animations:80/$1;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
}

方案二:Rewrite去除前缀

如果觉得正则写法繁琐,也可以用rewrite规则实现:

http {
    server {
        listen 80;
        server_name domain.co.uk;
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        server_name domain.co.uk;

        ssl_certificate /etc/nginx/cert.pem;
        ssl_certificate_key /etc/nginx/key.pem;

        resolver 127.0.0.11; # Docker内部DNS服务地址

        location /animations/ {
            rewrite ^/animations/(.*)$ /$1 break;
            proxy_pass http://animations:80;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
}

关键说明

  • Docker Compose内部会为每个服务分配以服务名为域名的DNS解析,所以必须用http://animations:80作为转发目标,而不是你之前写的animations-server。
  • 127.0.0.11是Docker内置的DNS服务器地址,固定不变,添加resolver指令后,Nginx就能正确解析内部服务域名。
  • 两种方案都能将https://domain.co.uk/animations/myVideo.mp4转发到后端服务的/myVideo.mp4,匹配后端Nginx配置中的/www/media/myVideo.mp4文件。

内容的提问来源于stack exchange,提问作者jdev9487

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 17:37:06