入口路由未命中django重定向的前缀



我在K8s集群中部署了一个Django应用程序,Ingress的路由有一些问题。

入口配置:

apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
name: main
namespace: ${namespace}
spec:
routes:
- conditions:
- prefix: /my-app
services:
- name: my-app-backend
port: 80
timeoutPolicy:
response: 60s
pathRewritePolicy:
replacePrefix:
- replacement: /

我的应用程序/网址.py

from django.urls import include, path
from overview import views
app_name = "overview"
urlpatterns = [
path("", views.index),
path("overview", views.overview)
...
]

我有一个类似example.com的url,其中的路径被重定向到几个K8服务。

URLexample.com/my-app/应该解析为我的服务my-app。到目前为止还不错,我可以看到我的应用程序的入口页面。

但如果我从这里开始点击按钮,Django所做的相对重定向并没有像预期的那样工作:

点击按钮,期望将我导航到CCD_ 4,靶向CCD_ 5,明显导致404。

我希望my-app中的所有重定向都有一个/my-app/前缀。我是Ingress新手,但我认为my-app不应该对这些信息负责,因为当域路径最终发生变化时,我必须更改两个repo(我想避免路由器或对前缀为/my-app/的url进行硬编码(。

我能和Ingress一起达到预期的行为吗?或者这里的最佳实践是什么?

我是Ingress新手,但我认为我的应用程序不应该对这些信息负责,因为当域路径最终更改时,我必须更改两个repo(我想避免路由器或硬编码前缀为/my-app/的url(。

这不是应用程序任务。你说得对,应该通过入口来处理。您的入口配置不正确。首先看一下官方文件:

如果存在prefix字段,则替换仅应用于具有完全匹配前缀条件的路由

在想要打开example.com/my-app/overview的情况下,会重定向到example.com/overview,因为my-app已被/替换。看起来你根本不需要改变路径。

但是,如果您想稍微更改您的yaml,请以以下为例,并通过提供适当的前缀和替换来适应您的需求。

apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
name: rewrite-example
namespace: default
spec:
virtualhost:
fqdn: rewrite.bar.com
routes:
- services:
- name: s1
port: 80
conditions:
- prefix: /v1/api
pathRewritePolicy:
replacePrefix:
- prefix: /v1/api
replacement: /app/api/v1
- prefix: /
replacement: /app

如果不存在prefix字段,则替换将应用于针对路由进行的所有前缀匹配。如果存在prefix字段,则替换仅应用于具有完全匹配前缀条件的路由。当HTTPProxy文档包含在多个父文档中时,指定多个replacePrefix条目非常有用。