Nginx反向代理Apache下WordPress站点重定向过多及配置异常问题
从你给出的配置片段和遇到的问题来看,这大概率是域名配置混乱、反向代理规则缺失,加上WordPress和反向代理的适配没做好导致的——我之前帮朋友排查过几乎一模一样的场景,下面给你拆解修复步骤:
一、先修正Nginx配置里的低级错误
你贴的第一个server块明显有域名不匹配的问题:
server { listen 80; server_name domain.com www.exemple.com; # 这里domain.com和后面跳转的exemple.com完全不搭! return 301 https://www.exemple.com; }
每个WordPress站点的Nginx配置必须对应自己的独立域名,不能把A站点的域名强制跳转到B站点的HTTPS地址,这会直接导致域名路由混乱,部分站点根本找不到正确的配置块。
正确的单站点标准配置模板
给每个站点单独写一对server块(80端口处理HTTP转HTTPS,443端口做反向代理),以exemple.com为例:
# 处理HTTP请求,强制跳转到HTTPS的www域名(保留请求路径) server { listen 80; listen [::]:80; server_name exemple.com www.exemple.com; return 301 https://www.exemple.com$request_uri; } # 处理HTTPS请求,反向代理到Apache后端 server { listen 443 ssl; listen [::]:443 ssl; server_name exemple.com www.exemple.com; # 补全你没写完的SSL stapling配置 ssl_certificate /etc/letsencrypt/live/exemple.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/exemple.com/privkey.pem; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/exemple.com/chain.pem; # 可选:添加TLS安全优化 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; # 核心:把请求转发到本地Apache(假设Apache监听8080端口) location / { proxy_pass http://127.0.0.1:8080; # 必须加这些头,让WordPress知道真实的访问协议和用户IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
⚠️ 重要提醒:15个站点要每个站点对应独立的Nginx配置文件(比如放在/etc/nginx/sites-available/,然后软链到/etc/nginx/sites-enabled/),绝对不能把多个站点的配置混写在同一个文件里,不然会出现路由匹配冲突,导致部分站点无法命中正确的配置。
二、搞定重定向过多的核心问题
重定向循环本质是WordPress不知道自己是通过HTTPS被访问的,它生成的链接是HTTP,Nginx又强制跳转到HTTPS,一来一回就死循环了。解决分两步:
1. 修正WordPress的站点URL
登录出问题站点的WordPress后台,进入「设置」→「常规」,把**WordPress地址(URL)和站点地址(URL)**都改成https://www.exemple.com(替换成你的实际域名)。
如果后台都登不上,直接改数据库:
登录MySQL,找到对应站点的数据库,执行:
UPDATE wp_options SET option_value = 'https://www.exemple.com' WHERE option_name = 'siteurl' OR option_name = 'home';
(注意把wp_换成你的数据库表前缀)
2. 强制WordPress识别HTTPS反向代理头
如果改了URL还是有问题,就在WordPress的wp-config.php文件末尾加这段代码:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on'; }
这段代码会让WordPress读取Nginx传过来的X-Forwarded-Proto头,强制认为当前是HTTPS请求,避免生成HTTP链接触发重定向。
三、排查3个失效站点的额外可能
既然12个站点正常,3个不行,除了配置问题,还要检查这些点:
- 失效站点的域名解析是否正确指向了Nginx服务器的IP;
- 它们的SSL证书是否有效(用
certbot certificates命令可以查看证书状态); - Apache的虚拟主机配置是否正确,是否监听了本地端口(比如8080),且ServerName和Nginx的server_name完全一致;
- 最后别忘了重载Nginx配置:先执行
sudo nginx -t检查语法有没有错,没问题再sudo systemctl reload nginx生效。
建议你先把失效站点的Nginx配置按上面的模板修正,再检查WordPress的URL设置,应该就能解决大部分问题了。
内容的提问来源于stack exchange,提问作者Arnaud

