Docker三容器部署WordPress出现too_many_redirects错误排查
重定向循环的核心诱因
- 反向代理协议头传递缺失:你配置的apache-letsencrypt容器在443端口做HTTPS反向代理时,是用HTTP协议把请求转发给WordPress容器的8073端口,但没有向后端传递「原始请求为HTTPS」的标识。
WordPress拿到的请求是标准HTTP协议请求,但你在wp_options表中设置的站点地址是https://www.example.com,WordPress内置逻辑会检测到请求协议与站点配置协议不匹配,自动生成301重定向跳转到HTTPS地址。
跳转后的请求再次回到外层Apache的443端口,Apache又以HTTP协议转发给WordPress,WordPress再次触发协议检测跳转,直接形成无限重定向循环。 - 配置冗余与路径不匹配:
- 给apache-letsencrypt服务同时配置了
network_mode: host和ports端口映射,host网络模式下端口映射配置会被Docker直接忽略,完全不生效 - WordPress容器内vhost配置的
DocumentRoot /var/www/example.com,和你实际存放站点文件的容器内路径/var/www/www.example.com不匹配,会导致后续出现文件找不到的问题 - 在apache容器hosts中添加的
172.17.0.1 www.example.com映射,属于完全多余的配置
- 给apache-letsencrypt服务同时配置了
具体修复步骤
- 修正外层443端口的Apache反向代理配置
移除原来基于域名的反代目标,直接指向本地回环地址,同时添加协议头传递规则:<VirtualHost *:443> ServerName www.example.com ServerAlias example.com SSLEngine On SSLCertificateFile "/etc/letsencrypt/live/www.example.com/cert.pem" SSLCertificateKeyFile "/etc/letsencrypt/live/www.example.com/privkey.pem" SSLCertificateChainFile "/etc/letsencrypt/live/www.example.com/fullchain.pem" SSLCACertificatePath "/etc/ssl/certs" SSLProxyEngine on # 传递原始请求协议标识给后端 RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-Ssl on # 直接指向本地WordPress容器映射的8073端口 ProxyPass / http://127.0.0.1:8073/ ProxyPassReverse / http://127.0.0.1:8073/ ProxyRequests Off </VirtualHost> - 让WordPress信任反向代理的协议头标识
在WordPress站点根目录的wp-config.php文件中,添加规则让WordPress识别反向代理传递的HTTPS标识,避免触发强制跳转:// 插入在wp-config.php中站点URL配置的相邻位置 if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on'; } - 修正WordPress容器内的vhost路径配置
把DocumentRoot改成和实际挂载路径一致的地址:<VirtualHost *:80> ServerName www.example.com ServerAlias example.com ServerAdmin webmaster@localhost # 修正为实际的站点文件路径 DocumentRoot /var/www/www.example.com <Directory /var/www/www.example.com> Options Indexes FollowSymLinks AllowOverride All </Directory> ErrorLog /var/log/apache2/example.com.error.log CustomLog /var/log/apache2/example.com.access.log combined </VirtualHost> - 清理冗余配置
- 从docker-compose.yaml的apache-letsencrypt服务段中,删除完全失效的
ports映射配置 - 从apache-letsencrypt容器的
/etc/hosts文件中,删除之前添加的多余域名映射
- 从docker-compose.yaml的apache-letsencrypt服务段中,删除完全失效的
验证方式
完成所有修改后,重启Apache服务和WordPress容器,清除浏览器本地缓存后重新访问站点,无限重定向的问题就会消失。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

