我有一个 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)
我有以下使用最新的 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)
我发现这里的文档也令人困惑。下面是我工作的一个例子。我相信您需要在 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)
| 归档时间: |
|
| 查看次数: |
7396 次 |
| 最近记录: |