Angular+.NET Core部署Docker后特定接口返回404错误求助
我开发的Web应用采用Angular前端、.NET Core后端,部署到服务器Docker环境后,多数页面可正常访问,但特定接口返回404 Not Found错误,该接口在本地运行完全正常。本地访问相同接口http://localhost:4200/api/Designer/selection/AA%20BB%20CC%2FDD%20EE可正常工作,服务器上仅该特定接口异常,其余功能正常。
后端代码:
[Authorize(Policy = "IsDesigner")] [Route("api/[controller]")] [ApiController] public class DesignerController : ControllerBase { ... [HttpGet("{project}/{loop}")] public async Task<IActionResult> GetChecklistByLoopAsync(string project, int loop, CancellationToken cancellationToken) { ... } }
前端代码:
getTaskByProject(role:string,project:string):Observable<any> { const encodedProject = encodeURIComponent(project); let requiredurl: string; requiredurl = `${this.apiUrl}/${role}/selection/${encodedProject}`; const headers = { 'content-type': 'application/json','Authorization':`Bearer ${this.getToken()}`} return this.http.get(requiredurl, {'headers':headers, observe:'response'}); }
错误信息:
polyfills.4cb30b968c6ea108.js:1 GET https://azeu1.pp.com:4200/api/Designer/selection/AA%20BB%20CC%2FDD%20EE 404 (Not Found) main.11182255502544c4.js:1 ERROR wr {headers: lo, status: 404, statusText: 'Not Found', url: 'https://azeu1.pp.com:4200/api/Designer/selection/AA%20BB%20CC%2FDD%20EE', ok: false, …} error : null headers : lo lazyInit : ()=> {…} lazyUpdate : null normalizedNames : Map(0) {size: 0} [[Prototype]] : Object message : "Http failure response for https://azeu1.pp.com:4200/api/Designer/selection/AA%20BB%20CC%2FDD%20EE: 404 Not Found" name : "HttpErrorResponse" ok : false status : 404 statusText : "Not Found" url : "https://azeu1.pp.com:4200/api/Designer/selection/AA%20BB%20CC%2FDD%20EE" [[Prototype]] : _S
Nginx配置:
worker_processes 1; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name azeu1.pp.com; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://pp_v3:5000/api/; } listen 443 ssl; server_name azeu1.pp.com; ssl_certificate /etc/nginx/certs/server.crt; ssl_certificate_key /etc/nginx/certs/server.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }
1. 接口路由不匹配
后端DesignerController暴露的接口路由是api/Designer/{project}/{loop},但前端请求的路径是api/Designer/selection/{encodedProject}——多了selection路径段,后端没有对应这个路径的Action。
本地能正常工作,大概率是本地后端有对应selection的Action未同步到服务器,或是部署的前端代码和本地版本不一致。
解决:
- 核对服务器后端代码,确认是否存在
[HttpGet("selection/{project}")]或匹配路由的Action; - 若后端无对应路由,修改前端请求路径去掉
selection,或后端新增对应路由的Action。
2. URL中转义斜杠的处理问题
请求的project参数包含/(转义后为%2F),Nginx默认会自动将%2F解码为实际的/,导致路径被拆分为api/Designer/selection/AA BB CC/DD EE,和后端预期的单参数路径不匹配。
解决:
在Nginx的location /api/块中添加配置,允许保留编码斜杠:
location /api/ { allow_encoded_slashes on; proxy_pass http://pp_v3:5000/api/; }
同时在.NET Core后端的Program.cs中配置允许编码斜杠:
builder.WebHost.ConfigureKestrel(options => { options.AllowEncodedSlashes = true; });
3. Docker容器网络验证
虽然其他接口正常,但可直接在服务器上测试后端容器的接口,排除网络转发问题:
curl http://pp_v3:5000/api/Designer/selection/AA%20BB%20CC%2FDD%20EE -H "Authorization: Bearer {你的Token}"
- 若该请求也返回404,问题出在后端;
- 若请求正常,说明是Nginx转发配置的问题。
4. 权限验证的隐性问题
后端接口带有[Authorize(Policy = "IsDesigner")]注解,部分自定义授权逻辑会在验证失败时返回404而非标准403,导致被误判为路径问题。
解决:
- 检查服务器上的JWT Token是否包含
IsDesigner权限; - 查看后端日志,确认授权过程是否有异常记录。
内容的提问来源于stack exchange,提问作者AoLiGei

