入口路由缺少 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.
我在 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 aprefix
field is present, the replacement is applied only to routes that have an exactly matching prefix condition. Specifying more than onereplacePrefix
entry is mainly useful when a HTTPProxy document is included into multiple parent documents.