Nginx Ingress - 如果没有匹配的路由,如何设置重定向到外部站点?
Nginx Ingress - how to set redirect to external site if there is no matching route?
这里是初学者。我目前正在尝试配置 Ingress 来做两件事 - 如果斐波那契路由存在,则重定向到函数并传递参数,如果路由不存在,则重定向到另一个网站并在那里附加输入。
因此,例如,有两种基本情况。
- https://xxx.amazonaws.com/fibonacci/10 -> 使用参数 10 调用斐波那契函数(有效)
- https://xxx.amazonaws.com/users/jozef -> calls redirect function which redirects to https://api.github.com/users/jozef
我认为执行重定向的服务写得正确,看起来像这样。
kind: Service
apiVersion: v1
metadata:
name: api-gateway-redirect-service
spec:
type: ExternalName
externalName: api.github.com
ports:
- protocol: TCP
targetPort: 443
port: 80 # Default port for image
这就是我的 Ingress 的样子。尝试了默认后端注释以及默认后端的各种放置,但没有任何效果。当我尝试 curl https://xxx.amazonaws.com/users/jozef 时,我不断收到 301 消息,但位置没有改变。最终输出如下所示
HTTP/1.1 301 Moved Permanently
Server: openresty/1.15.8.2
Date: Wed, 13 Nov 2019 15:52:14 GMT
Content-Length: 0
Connection: keep-alive
Location: https://xxx.amazonaws.com/users/jozef
* Connection #0 to host xxx.amazonaws.com left intact
* Maximum (50) redirects followed
curl: (47) Maximum (50) redirects followed
有人知道我做错了什么吗?这是我的入口。此外,如果有帮助,我们使用 Kubernetes 版本 1.14.6。百万感谢
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /fibonacci/(.*)
backend:
serviceName: fibonacci-k8s-service
servicePort: 80
- path: /(.*)
backend:
serviceName: api-gateway-redirect-service
servicePort: 80
所以我一直在阅读这个主题,结果发现入口控制器通常不通过服务,而是直接连接到 pods(它查找服务选择的 pods 和将它们配置到 nginx 中),这使得这里的用例(连接到 anypod 未备份的服务)注定要失败。
然而,在最近的版本中,nginx 入口控制器似乎仅支持 nginx+。
参考文献:
Support for Type ExternalName Services
Ingress uses Endpoints to configure PODs Ips in nginx config to load balance
问题的解决方法是在 curl 命令中添加 'Host: hostname'
header。
处理请求的服务需要 Host: hostname
header 才能正确回复此请求。在提供 hostname
header 后,响应是正确的。
链接:
这里是初学者。我目前正在尝试配置 Ingress 来做两件事 - 如果斐波那契路由存在,则重定向到函数并传递参数,如果路由不存在,则重定向到另一个网站并在那里附加输入。
因此,例如,有两种基本情况。
- https://xxx.amazonaws.com/fibonacci/10 -> 使用参数 10 调用斐波那契函数(有效)
- https://xxx.amazonaws.com/users/jozef -> calls redirect function which redirects to https://api.github.com/users/jozef
我认为执行重定向的服务写得正确,看起来像这样。
kind: Service
apiVersion: v1
metadata:
name: api-gateway-redirect-service
spec:
type: ExternalName
externalName: api.github.com
ports:
- protocol: TCP
targetPort: 443
port: 80 # Default port for image
这就是我的 Ingress 的样子。尝试了默认后端注释以及默认后端的各种放置,但没有任何效果。当我尝试 curl https://xxx.amazonaws.com/users/jozef 时,我不断收到 301 消息,但位置没有改变。最终输出如下所示
HTTP/1.1 301 Moved Permanently
Server: openresty/1.15.8.2
Date: Wed, 13 Nov 2019 15:52:14 GMT
Content-Length: 0
Connection: keep-alive
Location: https://xxx.amazonaws.com/users/jozef
* Connection #0 to host xxx.amazonaws.com left intact
* Maximum (50) redirects followed
curl: (47) Maximum (50) redirects followed
有人知道我做错了什么吗?这是我的入口。此外,如果有帮助,我们使用 Kubernetes 版本 1.14.6。百万感谢
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /fibonacci/(.*)
backend:
serviceName: fibonacci-k8s-service
servicePort: 80
- path: /(.*)
backend:
serviceName: api-gateway-redirect-service
servicePort: 80
所以我一直在阅读这个主题,结果发现入口控制器通常不通过服务,而是直接连接到 pods(它查找服务选择的 pods 和将它们配置到 nginx 中),这使得这里的用例(连接到 anypod 未备份的服务)注定要失败。
然而,在最近的版本中,nginx 入口控制器似乎仅支持 nginx+。
参考文献:
Support for Type ExternalName Services
Ingress uses Endpoints to configure PODs Ips in nginx config to load balance
问题的解决方法是在 curl 命令中添加 'Host: hostname'
header。
处理请求的服务需要 Host: hostname
header 才能正确回复此请求。在提供 hostname
header 后,响应是正确的。
链接: