c# - 在 Kubernetes 中的 nginx 代理后面配置 .Net Core

标签 c# nginx asp.net-core kubernetes

我无法让我的 asp.net core 网站在 Kubernetes 中的 ngnix 入口 Controller 后面工作。我可以查看该网站,但所有链接、CSS 和图像均已损坏。

我的 Ingress Controller 如下所示

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: apps-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: 
    http:
      paths:
      - path: /web(/|$)(.*)
        backend:
          serviceName: web-service
          servicePort: 80
      - path: /middle(/|$)(.*)
        backend:
          serviceName: middle-api-service
          servicePort: 80

我还将我的网站配置为使用转发 header

 app.UseForwardedHeaders(new ForwardedHeadersOptions
 {
      ForwardedHeaders = ForwardedHeaders.All
 });

我可以浏览到网站 {proxyaddress}/web 这会加载站点,但所有链接、CSS 和图像在转到根代理地址(没有为入口 Controller 配置的路径 /web)时都会中断。

我确实输出了网站收到的 header ,我可以看到:

header X-Real-IP - val:  10.240.0.4         
header X-Forwarded-For - val:  10.240.0.4         
header X-Forwarded-Host - val:  {ProxyAddress}       
header X-Forwarded-Port - val:  443         
header X-Forwarded-Proto - val:  https        
header X-Original-URI - val:  /web/        
header X-Scheme - val:  https     

我可以看到 header X-Original-URI 的值为 /web 我的网站需要将其用作所有链接的基础。

我尝试过app.UsePathBase("/web");

app.UseForwardedHeaders(new ForwardedHeadersOptions
            {
                ForwardedForHeaderName = "X-Original-URI",
                OriginalForHeaderName = "X-Original-URI",
                OriginalHostHeaderName = "X-Original-URI",
                ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
            });

似乎没有任何效果,我在网上找不到任何关于我需要设置什么才能使网站在代理配置的 /web 路径下工作的信息?

最佳答案

我找到了答案,因为我使用的是基于 /web 的 nginx 代理的路径

您需要将路径保留为 /web

,而不是重写目标以使 Controller 不会在 ASP.NET Core 应用程序中返回 404
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: apps-ingress
  labels:
    name: apps-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: 
    http:
      paths:
      - path: /web
        backend:
          serviceName: web
          servicePort: 80
      - path: /middle
        backend:
          serviceName: middle-api
          servicePort: 80

然后在应用程序配置部分将路径基数配置为等于/web

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (!String.IsNullOrEmpty(Configuration["PathBase"]))
                app.UsePathBase(Configuration["PathBase"]);

我还必须向应用程序添加一个环境变量,以便可以配置 /web,因为我无法访问 X-Original-URI应用程序启动时的标题。

关于c# - 在 Kubernetes 中的 nginx 代理后面配置 .Net Core,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56838883/

相关文章:

c# - 在没有 html 注入(inject)的情况下包装到 anchor 标记 2.5 M

c# - 如何编写等待 selenium webElement 的通用方法

c# - Azure Functions 模型绑定(bind)

php - nginx php 根目录下有 wordpress 和子目录中的另一个应用程序

php - 负载平衡 - 如何正确设置?

c# - .Net 核心全局过滤器

c# - .Net Core 3 IStringLocalizer.WithCulture(CultureInfo) 已过时

nginx - K8s Helm - 带有 Nginx Ingress 的 Jenkins

c# - ViewComponent 标签助手不工作

c# - 使用 ServiceProvider 将 IServiceProvider 注入(inject) SignInManager