Nginx反向代理WordPress出现间歇性Too Many Redirection问题求助
解决Nginx反向代理WordPress子目录的Too Many Redirections问题
这个问题我之前帮不少开发者踩过坑,核心就是缓存规则和反向代理的重定向逻辑撞车,再加上WordPress子目录配置的小细节没捋顺。咱们一步步来搞定:
先搞懂问题根源
你遇到的“时好时坏”是关键线索:
- 当访问
www.example.com/abc(不带尾斜杠)时,WordPress会自动重定向到带尾斜杠的/abc/,但如果Nginx把这个301/302重定向响应缓存了,后续请求就会直接返回缓存的重定向,时间久了就触发浏览器的“Too Many Redirections”限制;而缓存过期或没命中时,请求正常到达WordPress,就显示正常。 - 另外,如果反向代理时没正确传递请求头(比如
Host、X-Forwarded-Proto),WordPress会判断当前请求的URL和后台设置的站点URL不一致,也会触发循环重定向。
具体解决方案
1. 调整Nginx反向代理配置(核心)
直接在Nginx层面处理尾斜杠重定向,同时禁止缓存重定向响应,还要正确传递请求头给Apache/WordPress。把你原有的/abc相关location规则改成这样:
server { listen 80; server_name www.example.com; # 如果用HTTPS,记得补充listen 443 ssl;的配置 # React静态内容的缓存配置(保留你原来的即可) location / { root /path/to/your/react/static/files; try_files $uri $uri/ /index.html; # 你的缓存规则... } # 处理/abc路径的反向代理 location ~ ^/abc(.*)$ { # 禁止缓存重定向响应,从根源避免缓存导致的循环 proxy_no_cache $upstream_cache_status; proxy_cache_bypass $upstream_cache_status; # 关键:传递正确的请求头给WordPress proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; # 用HTTPS的话必须加这个! # 转发请求到Apache的地址(比如Apache跑在本地8080端口) proxy_pass http://127.0.0.1:8080/abc$1; # 提前在Nginx处理尾斜杠重定向,跳过WordPress的重定向逻辑 rewrite ^/abc$ /abc/ permanent; } }
解释下几个关键点:
rewrite ^/abc$ /abc/ permanent;:直接把不带尾斜杠的/abc重定向到/abc/,不让请求到达WordPress就完成重定向,避免后续的缓存问题。proxy_no_cache和proxy_cache_bypass:确保WordPress返回的重定向响应不会被Nginx缓存,彻底杜绝缓存导致的循环。X-Forwarded-Proto:如果你的站点用HTTPS,WordPress需要知道当前请求是HTTPS,否则会生成HTTP的URL,触发重定向循环。
2. 确认WordPress的配置
- 登录WordPress后台,进入设置→常规,确保**站点地址(URL)和首页地址(URL)**都是
https://www.example.com/abc/(注意带HTTPS和尾斜杠,和你的实际协议一致)。 - 检查Apache上WordPress目录的
.htaccess文件,确保重写规则是子目录的正确配置:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /abc/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /abc/index.php [L] </IfModule>
这里的RewriteBase /abc/和最后一行的/abc/index.php必须准确,否则WordPress会生成错误的URL,导致重定向。
3. 清理缓存并验证
- 清理Nginx的代理缓存(如果配置了
proxy_cache),还有浏览器缓存。 - 用命令测试:
curl -I https://www.example.com/abc,应该返回301重定向到https://www.example.com/abc/;再访问https://www.example.com/abc/,返回200 OK,没有循环重定向。
这样调整后,就能彻底解决“有时正常有时重定向过多”的问题了。
内容的提问来源于stack exchange,提问作者Saurabh Srivastava
相关产品推荐
相关产品推荐

