入口路由缺少 django 重定向的前缀

Ingress routing misses prefix for django redirects

我在 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: /

my-app/urls.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,其中路径被重定向到几个 K8s 服务。

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

但是如果我从这里开始点击按钮,Django 完成的相对重定向不会按预期工作:

一个按钮点击,预计会将我导航到 example.com/my-app/overview, 以 example.com/overview 为目标,这显然会导致 404。

我希望 my-app 中的所有重定向都有 /my-app/ 前缀。我是一名 Ingress 菜鸟,但我认为 my-app 不应该对此信息负责,因为当域路径最终发生变化时我将不得不更改两个回购协议(并且我想避免路由器或硬编码url 前缀为 /my-app/).

我可以使用 Ingress 实现这种预期的行为吗?或者这里的最佳实践是什么?

I'm an Ingress rookie, but i would assume that my-app shouldn't be responsible for this information, as I would have to change two repos when the domain path changes eventually (and i want to avoid routers or hardcoding the url prefixed to /my-app/).

这不是应用程序任务。你说得对,应该通过入口来处理。您的入口配置不正确。先看official documentation:

If a prefix field is present, the replacement is applied only to routes that have an exactly matching prefix condition

在您想打开 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

If no prefix field is present, the replacement is applied to all prefix matches made against the route. If a prefix field is present, the replacement is applied only to routes that have an exactly matching prefix condition. Specifying more than one replacePrefix entry is mainly useful when a HTTPProxy document is included into multiple parent documents.