nginx k8s 入口 - 强制 www 和 https?

标签 nginx kubernetes

我的 kubernetes 设置如下所示:

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

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

然而,让入口将非 www 流量重定向到网站的 www 版本并不容易。 我尝试使用 kubernetes.io/from-to-www-redirect: "true",但它似乎没有做任何事情 - 导航到 foo.com 不会将我重定向到网址的 www 版本,而是将我带到网站的不安全版本,或者将我导航到默认后端 - 404取决于我是否将 foo.com 作为主机包含在我的入口中并拥有自己的路径。

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

server {
  listen       80;
  server_name  foo.com;
  return       301 http://www.foo.com$request_uri;
}

更新: 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

最佳答案

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

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

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

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

关于nginx k8s 入口 - 强制 www 和 https?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48655450/

相关文章:

node.js - 使用 NGINX 提供静态文件时如何响应 Node.js 的 404?

docker - 如何在 k8s 集群中设置 docker registry?

kubernetes - 创建FTP服务

docker - kube-dns在kubernetes ARM 上不起作用

amazon-web-services - 如何使用 Elastic beanstalk 和 Dockerrun.aws.json 正确部署到 AWS?

docker - 无法访问 qbittorrent docker webui

nginx - 安装后如何为nginx配置附加模块?

python - Django 缓存在开发中有效,但在生产中无效

kubernetes - PromQL 绘制每小时创建的 Kubernetes POD 数量

elasticsearch - filebeat无法连接到Elasticsearch