ingress-nginx: 308 redirect loop when setting "force-ssl-redirect" to "true"
Is this a request for help? (If yes, you should use our troubleshooting guide and community support channels, see https://kubernetes.io/docs/tasks/debug-application-cluster/troubleshooting/.): No
What keywords did you search in NGINX Ingress controller issues before filing this one? (If you have found any duplicates, you should instead reply there.): force ssl redirect loop 308
Is this a BUG REPORT or FEATURE REQUEST? (choose one): Bug report
NGINX Ingress controller version: 0.10.0
Kubernetes version (use kubectl version): v1.8.5
Environment:
- Cloud provider or hardware configuration: AWS
- OS (e.g. from /etc/os-release): Container Linux by CoreOS 1576.5.0 (Ladybug)
- Kernel (e.g.
uname -a): 4.14.11-coreos - Install tools: kube-aws
- Others:
What happened:
The force-ssl-redirect flag seems not to be working anymore.
What you expected to happen:
This is what happened before I updated the nginx ingress controller (this is from version 0.9.0-beta.19):
$ kubectl -n kube-system port-forward hissing-wasp-nginx-ingress-controller-75b88b9b55-9vq8h 8080:80
Forwarding from 127.0.0.1:8080 -> 80
# In another terminal, redirect is expected
$ curl -I -H "Host: <ingress host>" -H "X-Forwarded-Proto: http" http://localhost:8080
HTTP/1.1 301 Moved Permanently
Server: nginx/1.13.7
Date: Tue, 23 Jan 2018 18:48:26 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: https://<ingress host>/
# Redirect is NOT expected
$ curl -I -H "Host: <ingress host>" -H "X-Forwarded-Proto: https" -H "X-Forwarded-Port: 443" http://localhost:8080
HTTP/1.1 200 OK
Server: nginx/1.13.7
Date: Tue, 23 Jan 2018 18:48:31 GMT
Content-Type: text/html
Content-Length: 79850
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: Next.js 4.2.1
This is what happens in 0.10.0:
# Redirect is expected
$ curl -I -H "Host: <ingress host>" -H "X-Forwarded-Proto: http" http://localhost:8080
HTTP/1.1 308 Permanent Redirect
Server: nginx/1.13.8
Date: Tue, 23 Jan 2018 18:47:04 GMT
Content-Type: text/html
Content-Length: 187
Connection: keep-alive
Location: https://<ingress host>/
# Redirect is NOT expected
$ curl -I -H "Host: <ingress host>" -H "X-Forwarded-Proto: https" -H "X-Forwarded-Port: 443" http://localhost:8080
HTTP/1.1 308 Permanent Redirect
Server: nginx/1.13.8
Date: Tue, 23 Jan 2018 18:47:19 GMT
Content-Type: text/html
Content-Length: 187
Connection: keep-alive
Location: https://<ingress host>/
About this issue
- Original URL
- State: closed
- Created 6 years ago
- Comments: 33 (12 by maintainers)
@trueinviso , in my case – also using the controller behind an AWS ELB – the infinite redirect loop was caused by a (documented) breaking change introduced in v0.22.0 regarding forwarded headers. Setting
use-forwarded-headers: "true"in the configmap (docs) fixed the issue for me.It appears that this may be an issue again.
I am using kubernetes on AWS and this is what my ingress looks like:
I am terminating TLS at the load balancer and I was getting the infinite redirect loop when I turned on
force-ssl-redirect="true", if i set it to false the loop stops but I don’t get a redirect to https. When I update the image in the ingress-nginx-controller deployment file to the previous version then all is well. So in case anyone else is unfamiliar with this like I was:kubectl edit deployment -n ingress-nginx nginx-ingress-controllerLook for:
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:<version>The newest version right now is 0.22.0:
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.22.0and I changed it to:
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.21.0It appears that this was fixed in the previous version, and then some new changes broke it again.
Tried the above
use-forwarded-headers: "true"within the configmap and it did not work. Using nginx version 0.24.1. Any one else having the same issue with 0.24.1@bfin Thanks! That fixes it. I’m not sure I would have been able to figure that out on my own haha.
Works for me 👍
That’s what I was suggesting, sorry, I didn’t make that too clear
Client -- HTTP -- > LB -- HTTPS --> NGINXEnds up with
X-Forwarded-Proto=httptherefore$pass_access_scheme=httpbut$scheme=httpsso the table entry ishttps:httpand we should redirect to getClient -- HTTPS -- > LB -- HTTPS --> NGINX