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

Angular+.NET Core部署Docker后特定接口返回404错误求助

问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:54:51