用 Nginx 作为 Web 服务器时,ERR_TOO_MANY_REDIRECTS 错误是常见的配置问题之一。这个错误通常是因为 Nginx 配置中存在错误的重定向规则或代理设置,让请求陷入无限重定向循环。本文主要说一些常见的导致 ERR_TOO_MANY_REDIRECTS 错误的 Nginx 配置问题及其解决方法。
1. HTTP 到 HTTPS 的重定向循环
最常见的原因之一是配置了不正确的 HTTP 到 HTTPS 的重定向。通常,站点希望强制所有流量用 HTTPS,如果 Nginx 的配置不正确,可能会导致 HTTP 到 HTTPS 的重定向循环。
错误做法:
1.配置错误的服务器重定向规则:服务器的配置可能不小心引入了重定向循环,导致请求在 HTTP 和 HTTPS 之间不断跳转。
2.浏览器缓存问题:浏览器可能会缓存重定向信息,特别是在 HTTP 到 HTTPS 的重定向没有被正确处理时,导致循环。
3.负载均衡器或代理配置问题:如果用了负载均衡器或代理服务器,可能存在错误的配置,导致请求在 HTTP 和 HTTPS 之间无休止地重定向。
解决方法:
确保 HTTP 和 HTTPS 的配置分别处理,并且不互相重定向。例如,正确的 HTTP 到 HTTPS 重定向配置应该像这样:
# HTTP -> HTTPS 重定向
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
# HTTPS 配置
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/certificate;
ssl_certificate_key /path/to/private_key;
# 其他 HTTPS 配置
}
2. X-Forwarded-Proto 头部的错误传递
如果 Nginx 作为反向代理工作,后端服务器可能会根据 X-Forwarded-Proto 头部决定请求的协议类型。如果配置错误,可能会导致后端服务器错误地认为请求是 HTTP 或 HTTPS,从而触发重定向。
错误做法:
在 Nginx 配置中,X-Forwarded-Proto 头部传递不正确,导致后端应用错误地决定需要重定向到 HTTPS 或 HTTP。
解决方法:
确保在代理请求时传递正确的 X-Forwarded-Proto 头部:
3. 代理协议冲突
如果请求通过 Nginx 代理到后端服务器,协议(HTTP 或 HTTPS)不一致也会导致重定向循环。特别是在 HTTP 请求被代理到 HTTPS 后端服务器时,如果后端服务器错误地认为请求是 HTTP,它可能会发送一个 HTTPS 重定向,造成循环。
错误做法:
Nginx 接收到 HTTP 请求并将其代理到 HTTPS 后端,但后端又重定向回 HTTP。
解决方法:
确认 Nginx 与后端服务器用相同的协议,并正确配置 proxy_set_header 头部。
4. 缓存问题
浏览器或代理服务器可能会缓存重定向响应,从而在重新访问时导致无限重定向。
示例场景:
由于浏览器缓存了错误的重定向响应,导致后续请求再次进入重定向循环。
解决方法:
清除浏览器缓存
ERR_TOO_MANY_REDIRECTS 错误通常由 Nginx 配置中的重定向、代理、协议处理等问题引起。仔细检查和调整 Nginx 配置,确保正确的重定向规则、代理设置和头部传递,可以避免这种错误。