nginx - Nginx 入口重写目标断开与 .NET Core API 的链接
问题描述
我有一个包含多个服务的设置,并通过 Ingress / Terraform / Kubernetes 设置运行。目前,我所有的 Vue.JS 应用程序都通过 NGINX 提供服务,但是当我添加以下行"nginx.ingress.kubernetes.io/rewrite-target": "/$1"
以确保我的其他路由(例如 /frontend 和 /backend)正常工作时,它破坏了我的 API,我无法再通过它访问它/api/
地形设置:
resource "kubernetes_ingress" "ingress" {
metadata {
name = "ingress"
namespace = var.namespace_name
annotations = {
"nginx.ingress.kubernetes.io/force-ssl-redirect" = true
"nginx.ingress.kubernetes.io/from-to-www-redirect" = true
"nginx.ingress.kubernetes.io/ssl-redirect": true
"nginx.ingress.kubernetes.io/add-base-url": false
"nginx.ingress.kubernetes.io/rewrite-target": "/$1"
"kubernetes.io/ingress.class": "nginx"
"ncp/use-regex": true
}
}
spec {
tls {
hosts = [var.domain_name, "*.${var.domain_name}"]
secret_name = "tls-secret"
}
rule {
host = var.domain_name
http {
path {
path = "/(.*)"
backend {
service_name = "frontend"
service_port = 80
}
}
path {
path = "/api(.*)"
backend {
service_name = "api"
service_port = 80
}
}
path {
path = "/backend(.*)"
backend {
service_name = "backend"
service_port = 80
}
}
path {
path = "/payment(.*)"
backend {
service_name = "payment"
service_port = 80
}
}
}
}
}
wait_for_load_balancer = true
}
我的Startup.cs
配置
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
// Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
// specifying the Swagger JSON endpoint.
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "OLC API V1");
});
app.UseCors(AllowSpecificOrigins);
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
terraform 设置似乎适用于我所有的 vue.js 容器。唯一的问题是 API 不再可访问。甚至没有通过 /api/api ,例如在这个问题中
我试图只重写特定的路线并更改应用程序,以便在不同的路线上提供服务,但我仍然收到404
错误。即使在创建响应/
路由的控制器时。删除重写目标行时,API 确实有效。但是 Vue.JS 容器没有
解决方案
事实证明,这只是一个正则表达式问题,我没有正确设置路径。我更改了以下内容。
path {
path = "/api(.*)"
backend {
service_name = "api"
service_port = 80
}
}
进入
path {
path = "/(api.*)"
backend {
service_name = "olc-api"
service_port = 80
}
}
这样,它将 /api 与我的 .NET 核心应用程序匹配,而不是尝试在 vue.js 容器中查找 URL
推荐阅读
- c# - 使用设计模式创建人(真实人或法人)
- elasticsearch - 在索引中为 Windows 事件日志 ID 创建额外字段
- grafana - Grafana 中的查询返回空值
- javascript - 在 HTML DOM 中使用 javascript 为 Web 元素调用 EventListener
- c# - 用 C# 读出谁在 Zoom 中说话
- linux - Azure 函数 .elf 文件 - 权限被拒绝
- c# - 将两个日期时间变量合二为一
- oracle - 如何在 Oracle JDBC 中使用参数?
- python - 如何在线程之间共享变量?
- php - WooCommerce 5.6.0 Checkout Coupon Form Issue using functions.php