我无法让我的asp.net核心网站在Kubernetes中的ngnix入口控制器后面工作。我可以查看该站点,但是所有链接,CSS和图像都已损坏。
我的Ingress控制器看起来像这样
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
路径下正常工作的信息。
答案 0 :(得分:1)
我找到了答案,因为我使用的是基于/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
标头。