繁体   English   中英

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

[英]Configure .Net Core behind nginx proxy in Kubernetes

我无法让我的 asp.net 核心网站在 Kubernetes 中的 ngnix 入口控制器后面工作。 我可以查看该站点,但所有链接、css 和图像都已损坏。

我的入口控制器看起来像这样

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

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

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

我可以浏览到位于{proxyaddress}/web这会加载网站,但是所有链接、css 和图像在转到根代理地址时都会中断,而/web是入口控制器的配置路径。

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

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     

我可以看到标题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 代理的路径

与其重写目标以使控制器不会在 asp.net 核心应用程序中返回 404,您需要将路径与/web原样

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标头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM