WordPress提示“重定向过多”求助(Nginx反向代理Apache架构)
解决Nginx反向代理Apache时WordPress前端重定向循环(Too Many Redirects)问题
我碰到过好几个类似的场景,你这种前端跳循环但后台能正常访问的情况,大概率是协议识别不匹配或者反向代理头没配置到位导致的,一步步排查试试:
1. 先确认WordPress的站点URL配置
后台能正常访问说明WP的后台路径是对的,但前端跳转可能是因为WP识别的访问协议/地址和实际不一致。
- 登录
example.com/wp-admin,进入「设置」→「常规」,检查**WordPress地址(URL)和站点地址(URL)**是不是和你实际访问的地址完全一致(比如你用HTTPS访问,这里就得是https://example.com,不能是HTTP)。 - 如果怕后台设置不生效,或者想直接强制配置,可以编辑WordPress根目录下的
wp-config.php,添加以下代码:
这段代码的核心是告诉WP:实际访问用的是HTTPS,别再跳转到HTTP了。define('WP_HOME','https://example.com'); define('WP_SITEURL','https://example.com'); define('FORCE_SSL_ADMIN', true); // 让WP识别反向代理传来的HTTPS协议 if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on'; }
2. 检查Nginx反向代理配置(/etc/nginx/sites-available/webproxy)
Nginx作为反向代理,必须把实际的访问协议、主机头这些信息传递给Apache,不然WP会认错环境。
- 先确保你的配置里已经传递了关键的代理头,参考下面的配置片段调整:
# 处理HTTP请求,重定向到HTTPS(如果你用HTTPS的话) server { listen 80; server_name example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name example.com; # 这里替换成你的SSL证书配置 ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; # 所有非PHP请求转发到Apache location / { proxy_pass http://localhost:8080; # 这里要改成Apache实际监听的端口(比如8080,别和Nginx的80冲突) proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; } # 静态资源可以让Nginx直接处理,提升性能(可选,但推荐) location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 30d; proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } # 所有PHP请求转发给Apache处理 location ~ \.php$ { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } } - 注意:Apache不能和Nginx监听同一个端口(比如都监听80),所以要把Apache的监听端口改成8080之类的,在Apache的
httpd.conf或者ports.conf里修改Listen 8080。 - 配置改完后,重启Nginx:
sudo systemctl restart nginx
3. 调整Apache的配置,信任反向代理头
Apache需要知道这些代理头是来自可信的Nginx,才能正确处理:
- 先启用
mod_remoteip模块:sudo a2enmod remoteip - 编辑Apache的主配置文件(比如
/etc/apache2/apache2.conf),添加:RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy 127.0.0.1 # 如果Nginx和Apache在同一服务器,填127.0.0.1就行 - 还要检查Apache的站点配置,有没有强制HTTP转HTTPS的规则,如果有,直接注释掉——因为HTTPS已经由Nginx处理了,Apache再重定向就会导致循环。比如类似这样的规则要删掉:
# RewriteEngine On # RewriteCond %{HTTPS} !=on # RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L] - 重启Apache:
sudo systemctl restart apache2
4. 清除缓存和Cookie
有时候浏览器缓存的旧重定向规则会干扰测试,试试:
- 用浏览器的隐私模式访问站点,看看是不是还跳循环
- 如果装了WordPress缓存插件,先清空插件缓存;没有插件的话,手动删除
wp-content/cache目录(如果存在)
按这几步走,基本就能解决重定向循环的问题了。
内容的提问来源于stack exchange,提问作者J Doe
相关产品推荐
相关产品推荐

