Nginx正则捕获路径后代理转发失败,如何实现正确转发?
解决方案
核心问题分析
- DNS解析失败:你在Nginx配置里用了
animations-server作为目标服务名,但Docker Compose中定义的服务名是animations,内部DNS只能解析服务名对应的域名;同时,当proxy_pass包含变量(如正则捕获的$1)时,Nginx需要显式指定DNS resolver才能解析域名。 - 路径转发错误:需要去掉请求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
相关产品推荐
相关产品推荐

