angular - UseSpa() 从 API 返回 index.html 而不是 404
问题描述
默认情况下,startup.cs 中的 .UseSpa() 会捕获到达其管道点的每个请求,并尝试将其作为对 SPA 主页的请求进行处理
我想在路由 /api/* 处为我的 API 调用保留 404,以防万一在 api url 中出现拼写错误,我的记录器将记录 404,而不是像“错误代码:200 消息:解析 https 期间的 Http 失败: //localhost:5001/api/non-existing-api-should-give-404" (因为它得到了 index.html 作为响应)
已经花了一天的时间,我找不到解决方案:( UseSpa() 似乎覆盖了任何不匹配的端点。任何想法如何解决它?
这是 Startup.cs 的基本配置,问题出在生产环境中。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHttpsRedirection();
if (!env.IsDevelopment())
{
app.UseSpaStaticFiles();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.UseSpa(spa =>
{
if (env.IsDevelopment())
{
spa.UseProxyToSpaDevelopmentServer("http://127.0.0.1:4200");
}
});
}
解决方案
UseSpa
middlware 是一个包罗万象的工具,任何到达该点的请求都将始终返回默认的 SPA 页面。这意味着对尚未找到控制器的路由的任何请求将始终返回默认的 SPA 页面,而不是抛出 404。
UseSpa()
只有在路由没有前缀的情况下才会调用它/api
。这实质上允许任何以/api
跳过该点开始的请求。
改变:
app.UseSpa(spa =>
{
//...
});
至:
app.MapWhen(x => !x.Request.Path.Value.StartsWith("/api"), builder =>
{
builder.UseSpa(spa =>
{
//...
});
});
这将允许从该点开始的任何请求,/api
如果没有其他中间件或路由匹配,404
则将返回 a。
推荐阅读
- wordpress - 我正在寻找一个购买插件
- postgresql - 复合唯一键的 Gorm 标签
- reactjs - if/else 条件或循环获取?
- json - 用jq简化geojson坐标精度
- python - 使用 BeautifulSoup 抓取不同的 URL 和特定行
- azure - Azure 功能的服务总线触发器是否需要管理对服务总线队列/主题的访问权限?
- mongodb - 如何使用动态键和动态值编写spring data mongodb查询?
- python - 为什么python要求我从主包目录上方的文件中导入?
- macos - 自动更新订阅 latest_receipt_info 数组顺序是否在 MacOS 中颠倒?
- audio - 混合来自各种来源的音频,无论输入视频是否有声音