我的 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/