Nginx 入口资源 - 从重定向到 www(SSL 不起作用)
Nginx ingress resource - Redirect from to www (SSL doesn't work)
用例
我使用这个 helm 图表在我的 Kubernetes 集群中部署了 nginx 入口控制器:
https://github.com/helm/charts/tree/master/stable/nginx-ingress
我为我的前端服务网络服务器创建了一个入口资源,它应该从非 www 版本重定向到 www 版本。我也在使用 SSL。
问题
当我访问我网站的 www 版本时,一切正常,nginx 使用我的 Lets Encrypt SSL 证书(它作为秘密存在于正确的命名空间中)为页面提供服务。但是,当我访问该网站的非 www 版本时,我在我的浏览器 (NET::ERR_CERT_AUTHORITY_INVALID) 中看到失败的 SSL 证书页面,并且可以看到该页面是使用 Kubernetes 入口假证书提供的。我想这也是为什么重定向到 www 版本根本不起作用的原因。
这是我的入口资源(实际主机名已被编辑):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
creationTimestamp: 2018-10-03T19:34:41Z
generation: 3
labels:
app: nodejs
chart: nodejs-1.0.1
heritage: Tiller
release: example-frontend
name: example-frontend
namespace: microservices
resourceVersion: "5700380"
selfLink: /apis/extensions/v1beta1/namespaces/microservices/ingresses/example-frontend
uid: 5f6d6500-c743-11e8-8aaf-42010a8401fa
spec:
rules:
- host: www.example.io
http:
paths:
- backend:
serviceName: example-frontend
servicePort: http
path: /
tls:
- hosts:
- example.io
- www.example.io
secretName: example-frontend-tls
问题
为什么 nginx 在非 www 版本上不使用提供的证书?
您似乎通过添加附加规则解决了接收无效证书的问题。
重定向问题似乎与 this 有关,并且在撰写本文时尚未解决。但是,有一个解决方法,如 link:
中所述
nginx.ingress.kubernetes.io/configuration-snippet: |
if ($host = 'foo.com' ) {
rewrite ^ https://www.foo.com$request_uri permanent;
}
我通过在规则中添加非 www 版本来修复它。重定向仍然不起作用,但页面使用正确的 SSL 证书提供。
- host: example.io
http:
paths:
- backend:
serviceName: example-frontend
servicePort: http
path: /
用例
我使用这个 helm 图表在我的 Kubernetes 集群中部署了 nginx 入口控制器:
https://github.com/helm/charts/tree/master/stable/nginx-ingress
我为我的前端服务网络服务器创建了一个入口资源,它应该从非 www 版本重定向到 www 版本。我也在使用 SSL。
问题
当我访问我网站的 www 版本时,一切正常,nginx 使用我的 Lets Encrypt SSL 证书(它作为秘密存在于正确的命名空间中)为页面提供服务。但是,当我访问该网站的非 www 版本时,我在我的浏览器 (NET::ERR_CERT_AUTHORITY_INVALID) 中看到失败的 SSL 证书页面,并且可以看到该页面是使用 Kubernetes 入口假证书提供的。我想这也是为什么重定向到 www 版本根本不起作用的原因。
这是我的入口资源(实际主机名已被编辑):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
creationTimestamp: 2018-10-03T19:34:41Z
generation: 3
labels:
app: nodejs
chart: nodejs-1.0.1
heritage: Tiller
release: example-frontend
name: example-frontend
namespace: microservices
resourceVersion: "5700380"
selfLink: /apis/extensions/v1beta1/namespaces/microservices/ingresses/example-frontend
uid: 5f6d6500-c743-11e8-8aaf-42010a8401fa
spec:
rules:
- host: www.example.io
http:
paths:
- backend:
serviceName: example-frontend
servicePort: http
path: /
tls:
- hosts:
- example.io
- www.example.io
secretName: example-frontend-tls
问题
为什么 nginx 在非 www 版本上不使用提供的证书?
您似乎通过添加附加规则解决了接收无效证书的问题。
重定向问题似乎与 this 有关,并且在撰写本文时尚未解决。但是,有一个解决方法,如 link:
中所述nginx.ingress.kubernetes.io/configuration-snippet: |
if ($host = 'foo.com' ) {
rewrite ^ https://www.foo.com$request_uri permanent;
}
我通过在规则中添加非 www 版本来修复它。重定向仍然不起作用,但页面使用正确的 SSL 证书提供。
- host: example.io
http:
paths:
- backend:
serviceName: example-frontend
servicePort: http
path: /