我追求一个非常简单的要求——但在外部负载均衡器后面时,似乎不可能让 Traefik 将流量从 HTTP 重定向到 HTTPS。
这是我的 GCE 入口
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: platform
name: public-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: "kubernetes-cluster-dev-ip"
kubernetes.io/ingress.class: "gce"
ingress.gcp.kubernetes.io/pre-shared-cert: "application-dev-ssl,application-dev-graphql-ssl"
spec:
backend:
serviceName: traefik-ingress-service
servicePort: 80
它接收来自 HTTP(S) 的流量,然后转发到 Traefik 到端口 80。
我最初尝试使用 Traefik 重定向与此配置匹配模式的方式:
[entryPoints]
[entryPoints.http]
address = ":80"
compress = true
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
compress = true
[entryPoints.https.tls]
但显然会进入无限重定向循环,因为负载均衡器总是将流量代理到 Traefik 端口 80。
完成这项工作的简单解决方案正是 GCE 建议的 https://github.com/kubernetes/ingress-gce#ingress-cannot-redirect-http-to-https
能够检查http_x_forwarded_proto
标题并基于此重定向。
Nginx 等效
# Replace '_' with your hostname.
server_name _;
if ($http_x_forwarded_proto = "http") {
return 301 https://$host$request_uri;
}
有人可以建议用 Traefik 处理这个问题的最佳方法是什么,拜托!