WordPress 在 Nginx 前端代理后出现重定向循环的问题

0
14

当 WordPress 位于 Nginx 前端(反向代理) 时,如果代理头信息配置不当,会导致:

  • 首页无限重定向
  • 登录页面不断跳转
  • 后台进不去
  • 浏览器提示“过多重定向”(Too many redirects)

许多人尝试通过修改 WordPress 核心文件(如 canonical.phptemplate-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_HOST
  • HTTPSX-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';

四、总结:最佳实践

  1. 不要修改 WP 核心文件
  2. 确保 Nginx 将 X-Forwarded-Proto 正确传给 PHP
  3. wp-config.php 中处理 HTTPS
  4. 确保站点 URL 设置一致
  5. 清理浏览器缓存 / CDN 缓存后重新测试

只有这样才能根本解决重定向循环问题。

发布回复

请输入评论!
请输入你的名字