nginx k8s 入口 - 强制使用 www 和 https?

Art*_*rov 13 nginx kubernetes

我有一个 kubernetes 设置,如下所示:

nginx 入口 -> 负载均衡器 -> nginx 应用程序

在获得www .foo.com的 SSL 证书后,我已将它作为秘密安装在我的 nginx 入口中,并且它按预期工作 - 流量www.foo.com被重定向到该https版本,并且浏览器显示安全连接指示器。伟大的。

什么也没有一帆风顺,然而,越来越入口重定向非www网站流量的WWW版本。我试过使用kubernetes.io/from-to-www-redirect: "true",但它似乎没有做任何事情 - 导航到foo.com不会将我重定向到url的www版本,而是将我带到我网站的不安全版本,或者default backend - 404根据是否将我导航到我foo.com作为主机包含在我的入口中,它有自己的路径。

通过将以下内容添加到我的实际应用程序的 nginx 配置中,我已经能够设置不完整的重定向 -

server {
  listen       80;
  server_name  foo.com;
  return       301 http://www.foo.com$request_uri;
}
Run Code Online (Sandbox Code Playgroud)

更新: from-to-www-redirect有效;你只需要参考它nginx.ingress.kubernetes.io而不是kubernetes.io像我一样。但是,这仅适用于foo.com-https://foo.com明确输入会导致浏览器显示安全警告,并且不会重定向到正确的 URL https://www.foo.com

这是我当前的 nginx 入口配置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: foo-https-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
spec:
  rules:
    - host: www.foo.com
      http:
        paths:
          - backend:
              serviceName: foo-prod-front
              servicePort: 80
            path: /
  tls:
      - hosts:
          - www.foo.com
        secretName: tls-secret
Run Code Online (Sandbox Code Playgroud)

Mar*_*ius 14

您需要为要重定向的域添加证书:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: foo-https-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
spec:
  rules:
    - host: foo.com
      http:
        paths:
          - backend:
              serviceName: foo-prod-front
              servicePort: 80
            path: /
    - host: www.foo.com
      http:
        paths:
          - backend:
              serviceName: foo-prod-front
              servicePort: 80
            path: /
  tls:
      - hosts:
          - foo.com
          - www.foo.com
        secretName: tls-secret
Run Code Online (Sandbox Code Playgroud)

我不完全确定,是否from-to-www-redirect适用于此设置,但您可以使用以下行替换它,这些行确实有效:

    nginx.ingress.kubernetes.io/configuration-snippet: |
      if ($host = 'foo.com' ) {
        rewrite ^ https://www.foo.com$request_uri permanent;
      }
Run Code Online (Sandbox Code Playgroud)


dem*_*isx 8

我有以下使用最新的 nginx-ingress 完成这项工作0.25.1

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-rule-web
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/from-to-www-redirect: 'true'
spec:
  rules:
    - host: foo.org
      http:
        paths:
          - path: /
            backend:
              serviceName: web
              servicePort: 80
  tls:
    - hosts:
        - foo.org
        - www.foo.org
      secretName: letsencrypt-prod
Run Code Online (Sandbox Code Playgroud)


Ste*_*icz 5

我发现这里的文档也令人困惑。下面是我工作的一个例子。我相信您需要在 tls 证书中定义裸 URL 以避免证书错误(您的证书需要对 foo.com 和 www.foo.com 均有效)。您不能在 rules: hosts 下列出裸 URL,因为它会在重定向之前被拾取。

http://foo.com -> https://www.foo.com

https://foo.com -> https://www.foo.com

http://www.foo.com -> https://www.foo.com

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: foo-https-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
spec:
  rules:
    - host: www.foo.com
      http:
        paths:
          - backend:
              serviceName: foo-frontend
              servicePort: 80
            path: /
  tls:
      - hosts:
          - foo.com
          - www.foo.com
        secretName: tls-secret
Run Code Online (Sandbox Code Playgroud)