当 WordPress 位于 Nginx 前端(反向代理) 时,如果代理头信息配置不当,会导致:
- 首页无限重定向
- 登录页面不断跳转
- 后台进不去
- 浏览器提示“过多重定向”(Too many redirects)
许多人尝试通过修改 WordPress 核心文件(如 canonical.php、template-loader.php),虽然能暂时绕过,但属于不安全且不推荐的方式。下面先保留你提到的“临时修改方法”,然后补充正确解决方案。
一、临时方案(修改 WP 核心文件,不推荐)
仅用于排查问题,不建议长期使用,否则 WordPress 更新后会被覆盖,且可能造成不可预料的错误。
1. 修改 canonical.php(不建议长期使用)
位置:
/wp-includes/canonical.php
找到:
function redirect_canonical( $requested_url = null, $do_redirect = true )
将其中的第二个参数从 true 改为 false:
function redirect_canonical( $requested_url = null, $do_redirect = false )
作用:
禁用 WordPress 的 canonical 重定向(例如 HTTP → HTTPS、非 www → www)。
缺点:
可能导致 SEO 出问题、无法做规范链接重定向。
2. 修改 template-loader.php(风险更大)
位置:
/wp-includes/template-loader.php
找到:
if ( defined('WP_USE_THEMES') && WP_USE_THEMES )
do_action('template_redirect');
有人建议注释掉:
/*
if ( defined('WP_USE_THEMES') && WP_USE_THEMES )
do_action('template_redirect');
*/
风险:
- 可能导致主题无法加载
- 插件失效
- 前端页面直接出错
属于“纯暴力禁用 WP 重定向逻辑”方式,不推荐。
二、真正导致重定向循环的原因(核心)
WordPress 会依据服务器传入的两个头判断站点 URL 和是否 HTTPS:
HTTP_HOSTHTTPS或X-Forwarded-Proto
如果你用 Nginx 反代 Apache 或直接反代 WordPress(PHP-FPM),但没有正确传递头部,WordPress 会认为:
- 自己的 URL 是 HTTP
- 但你通过 HTTPS 访问
- WP 尝试重定向为 HTTPS
- 代理再转回 HTTP
- 循环开始,将你困在重定向地狱
三、正确解决方案(官方推荐)
无需修改任何 WordPress 核心文件!
1. 修复 Nginx 反向代理配置
在反向代理的 location / 中加入:
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
关键点:必须加 X-Forwarded-Proto,否则 WP 无法识别 HTTPS。
2. 在 wp-config.php 中强制识别 HTTPS(推荐)
在 wp-config.php 中加入下面两行(放在最前面不要紧):
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS'] = 'on';
}
作用:
- 告诉 WordPress:你现在是在 HTTPS 环境下
- 避免 WordPress 自己重定向
3. WordPress 地址和站点地址要一致
在后台:设置 → 常规
- WordPress 地址(URL)
- 站点地址(URL)
必须保持一致,如:
https://example.com
如果后台进不去,可直接在数据库中修改:
UPDATE wp_options SET option_value='https://example.com' WHERE option_name='siteurl';
UPDATE wp_options SET option_value='https://example.com' WHERE option_name='home';
四、总结:最佳实践
- 不要修改 WP 核心文件
- 确保 Nginx 将
X-Forwarded-Proto正确传给 PHP - 在
wp-config.php中处理 HTTPS - 确保站点 URL 设置一致
- 清理浏览器缓存 / CDN 缓存后重新测试
只有这样才能根本解决重定向循环问题。








