我正在嘗試在我的 Kubernetes 集群中公開一個網站。因此,我創建了一個鏈接到我的服務和我的 Pod 的 Ingress。到目前為止,一切正常。但是現在當我開始在我的頁面上導航時,URL 發生了變化,但顯示的站點仍然是“主頁”。如何在頁面上導航并正確訪問所有子頁面?
我的部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: wichteln-deployment
spec:
replicas: 1
selector:
matchLabels:
app: wichteln
template:
metadata:
labels:
app: wichteln
spec:
containers:
- image: jonasgoetz01/website:V1.0
name: wichteln-container
command: ["/bin/sh"]
args:
- -c
- >-
apt update
我的服務:
apiVersion: v1
kind: Service
metadata:
name: wichteln-service
spec:
selector:
app: wichteln
ports:
- protocol: TCP
port: 5000
targetPort: 5000
我的入口:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wichteln-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: public
rules:
- http:
paths:
- path: /wichteln/*
pathType: Prefix
backend:
service:
name: wichteln-service
port:
number: 5000
該網頁是一個 NodeJS 快速網頁。這是我的 routes.js 檔案供參考(如果您需要更多檔案,請告訴我):
const express = require('express');
const router = express.Router();
const controller = require('../controllers/controller');
// Routes
router.get('/', controller.home);
router.get('/usermanagement/', controller.viewuser);
router.post('/usermanagement/', controller.finduser);
router.get('/usermanagement/adduser', controller.formuser);
router.post('/usermanagement/adduser', controller.createuser);
router.get('/usermanagement/edituser/:id', controller.edituser);
router.post('/usermanagement/edituser/:id', controller.updateuser);
router.get('/usermanagement/viewuser/:id', controller.viewalluser);
router.get('/usermanagement/:id',controller.deleteuser);
module.exports = router;
每次我嘗試訪問該頁面時,我都會從主頁開始。當我點擊一些通常會將我重定向到子頁面的按鈕時,即使 URL 正確更改,我也會留在主頁上。例如,主頁 URL 是:www.mydomain.com/wichteln→ 我可以看到主頁。
www.mydomain.com/wichteln/usermanagement→ 我仍然可以看到主頁,但想看到子頁面“用戶管理”。
感謝您的幫助。
uj5u.com熱心網友回復:
問題很可能來自您在入口清單中的重寫。
nginx.ingress.kubernetes.io/rewrite-target: /
這意味著當入口收到來自客戶端的請求時,它會獲取pathurl的一部分并將其重寫為/,然后將其傳遞給您的后端,這反過來又會導致后端回傳您網站的根頁面。
uj5u.com熱心網友回復:
您應該洗掉重寫注釋并使用此注釋:
nginx.ingress.kubernetes.io/use-regex: "true"
在你的路徑配置中,你可以嘗試這樣的事情:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wichteln-ingress
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
ingressClassName: public
rules:
- http:
paths:
- path: /wichteln/.*
pathType: Prefix
backend:
service:
name: wichteln-service
port:
number: 5000
此配置創建以下 NGINX 位置塊:
location ~* "^/wichteln/.*" {
...
}
uj5u.com熱心網友回復:
路徑重寫 捕獲組
您可以使用捕獲組來捕獲路徑前綴之后的部分,并在重寫規則中使用它,請參閱檔案。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wichteln-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: public
rules:
- http:
paths:
- path: /wichteln/(/|$)(.*)
pathType: Prefix
backend:
service:
name: wichteln-service
port:
number: 5000
背景關系路徑
或者,并不少見,是將背景關系路徑注入到您的應用程式中。然后你不需要在你的入口清單上重寫任何路徑。
...
const ctx = process.env.CONTEXT_PATH || ''
router.get(`${ctx}/`, controller.home);
router.get(`${ctx}/usermanagement/`, controller.viewuser);
...
要注入它,請將其添加到 pod 規范中。
...
spec:
containers:
- image: jonasgoetz01/website:V1.0
env:
- name: CONTEXT_PATH
value: /wichteln
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/374083.html
標籤:表达 Kubernetes Kubernetes 入口
