Nginx入口控制器重写目标注释和规则,以向url添加尾随斜杠 [英] Nginx ingress controller rewrite-target annotation and rule to add a trailing slash to url

查看:13
本文介绍了Nginx入口控制器重写目标注释和规则,以向url添加尾随斜杠的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将一个静态网站部署到Kubernetes集群,该集群使用官方的Nginx Inress控制器。该网站的文件夹结构如下所示:

/
├── about
│   └── index.html
├── casestudy
│   ├── data-and-analytics
│   │   └── index.html
│   └── workflow-automation
│       └── index.html
├── contact
│   └── index.html
├── css
│   ├── font-awesome.min.css
│   ├── fonts
│   │   ├── slick.eot
│   │   ├── slick.svg
│   │   ├── slick.ttf
│   │   └── slick.woff
│   ├── footer.css
│   ├── layout.css
...

我的入口定义如下:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: website-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    # nginx.ingress.kubernetes.io/rewrite-target: /$2
    cert-manager.io/cluster-issuer: letsencrypt
spec:
  tls:
    - hosts:
        - website.com
      secretName: website-tls
  rules:
    - host: website.com
      http:
        paths:
          - path: /
            backend:
              serviceName: website-svc
              servicePort: 8080

这在大多数情况下都可以很好地工作,只是如果我忘记在URL的末尾加上一个斜杠,比如https://website.com/about,我会被路由到一个错误页面。我理解为什么会发生这种情况-Nginx正在寻找about.html文件,但找不到。但我不知道如何解决这个问题。

理想情况下,我希望在没有后缀的请求中添加尾随/。但我也不希望在浏览器请求css文件时执行此操作。

我应该为此使用什么重定向批注和规则?

谢谢。

推荐答案

在这种情况下最终起作用的是这样一个代码片段:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: website-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt
    nginx.ingress.kubernetes.io/rewrite-target: /
    # Rewrite all URLs not ending with a segment containing . or ? with a trailing slash
    # So basically we are rewriting all folder names with a trailing slash.
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite ^([^.?]*[^/])$ $1/ redirect;
spec:
  tls:
    - hosts:
        - website.com
      secretName: website-tls
  rules:
    - host: website.com
      http:
        paths:
          - path: /
            backend:
              serviceName: website-svc
              servicePort: 8080

这将允许我们重写所有以不包含.(句点-从而避免文件名)?(问号-从而避免所有查询字符串)的段结尾的URL。这适用于我的情况。

这篇关于Nginx入口控制器重写目标注释和规则,以向url添加尾随斜杠的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆