我想实现以下重定向,并确保它们全部一步完成:
我在Digital Ocean上有一个Kubernetes(1.15.5)集群,它使用stable/nginx-ingress
(通过头盔安装),也使用cert-manager
处理SSL。
在我的Ingress配置中,我已禁用ssl重定向,因为我想在服务本身中处理此问题:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: proxy
namespace: default
annotations:
kubernetes.io/tls-acme: "true"
kubernetes.io/ingress.class: "nginx"
certmanager.k8s.io/issuer: "letsencrypt-prod"
certmanager.k8s.io/acme-challenge-type: http01
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
tls:
- hosts:
- example.com
- www.example.com
secretName: tls-example-com
rules:
- host: example.com
http:
paths:
- backend:
serviceName: nginx-service
servicePort: 80
- host: www.example.com
http:
paths:
- backend:
serviceName: nginx-service
servicePort: 80
我的一项服务是Nginx服务器:
server {
server_name example.com;
return 301 https://wwww.$host$request_uri;
}
server {
server_name www.example.com;
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
# app
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
但是,这里的$scheme
始终是'“ http”',这很有意义,因为我的服务仅在端口80上接收请求。但是就像原始地址(主机信息)被转发到我的服务一样,我如何找到原来的端口是什么?
由入口控制器设置的nginx充当反向代理,并在其后面的服务中插入X-Forwarded- *标头以供读取。您的服务必须使用这些服务来获取正确的客户端ip,端口或方案。
对于nginx,您可以使用$http_x_forwarded_proto
:
if ($http_x_forwarded_proto != "https") {
return 301 https://$host$request_uri;
}