返回

WordPress 多站点 302 重定向循环详解与解决

php

WordPress 多站点 302 重定向循环问题分析与解决

当在 WordPress 中启用多站点功能(特别是子目录模式)时,可能会遇到 302 重定向循环,导致浏览器出现 ERR_TOO_MANY_REDIRECTS 错误。此问题通常发生在配置不当的情况下,可能涉及服务器、WordPress 设置或网络配置,如 CloudFlare 等服务。下面我们将详细分析问题原因,并提供相应的解决方案。

问题根源:重定向配置冲突

这类问题的主要原因是存在相互冲突或无限循环的重定向规则。在 WordPress 多站点环境下,涉及到 URL 的重写,任何不当配置都可能导致无限重定向。 通常的涉及点有以下:

  • HTTPS 和 HTTP 协议不匹配 : 站点使用了 HTTPS 但部分配置仍强制使用 HTTP,导致请求在两者之间无限循环。
  • WordPress URL 配置错误 : WP_SITEURLWP_HOME 的设置与实际的站点访问 URL 不符,引起循环。
  • CloudFlare 设置不当 : CloudFlare 的 HTTPS 灵活模式等设置与服务器端配置存在冲突,尤其在使用负载均衡或反向代理时。
  • .htaccess 或服务器配置不正确 : 错误的重写规则或者过多的强制重定向,将流量引入死循环。
  • Nginx 配置问题 : 如果你使用Nginx而不是Apache,不正确的配置也有可能产生相同问题。

解决方案

针对以上可能的问题,下面提供了详细的解决步骤。

1. 强制 HTTPS 并修正 wp-config.php

确保整个网站强制使用 HTTPS,同时正确配置 wp-config.php 中的 WP_HOMEWP_SITEURL。 这避免了HTTP 和HTTPS 之间的不必要重定向。

  • 原理 : 明确定义站点的完整 URL,防止 WordPress 在内部或与数据库交互时发生重定向错误。

  • 操作步骤

    1. 打开 wp-config.php 文件。
    2. 检查并修正 WP_HOMEWP_SITEURL 为包含 https:// 的完整 URL,例如:
    define('WP_HOME', 'https://site.domain');
    define('WP_SITEURL', 'https://site.domain');
    
  1. 如果强制 HTTPS,请确保FORCE_SSL_ADMIN 的配置。如配置了类似以下的内容:

     define('FORCE_SSL_ADMIN', true);
    if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
          $_SERVER['HTTPS']='on';
    

    确保你的代码是这样的。 这段代码可以正确处理通过负载均衡器转发请求时的 HTTPS。

4.  保存并关闭文件。

2. CloudFlare HTTPS 设置

如果使用 CloudFlare,请检查 SSL/TLS 设置,尤其是灵活模式。建议使用“完整”或“严格”模式,而不是“灵活”模式。

  • 原理 : CloudFlare 灵活模式要求源服务器(您的服务器)接受 HTTP 请求。若您的服务器强制 HTTPS,则会导致请求来回循环。选择“完整”模式可以保证 CloudFlare 和服务器之间的 HTTPS 连接。

  • 操作步骤

    1. 登录 CloudFlare 控制台。
    2. 选择你的域名。
    3. 转到“SSL/TLS” > “概述”。
    4. 将 SSL/TLS 加密模式设置为 “完整(Full)” 或“严格(Strict)” 。
    5. 如果你使用反向代理或者负载均衡器请确保 "始终使用 HTTPS" 开关已经打开。 默认处于 "关闭" 状态。 请修改为你实际的情况。

3. 检查并清理 .htaccess 文件

如果重定向问题仍然存在,仔细检查 WordPress 的 .htaccess 文件中的规则。 过于复杂的规则或者错误的规则可能会产生重定向死循环。

  • 原理.htaccess 文件中的 RewriteRule 定义了 HTTP 请求如何重定向和处理, 错误设置会引发问题。
  • 操作步骤
    1. 找到站点根目录下的 .htaccess 文件。
    2. .htaccess 文件重命名,例如 htaccess_backup 来备份现有文件,或直接删除(稍后可能会要求 WordPress自动重新创建)。
    3. 如果 WordPress 未自动创建,手动创建 .htaccess 并将默认的 WordPress 代码粘贴进去。一个默认的标准 wordpress 多站点的 .htaccess 应该类似于下面这样:
   # BEGIN WordPress
      # The directives (lines) between "BEGIN WordPress" and "END WordPress" are
      # dynamically generated, and should only be modified via WordPress filters.
      # Any changes to the directives between these markers will be overwritten.
      RewriteEngine On
      RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
      RewriteBase /
      RewriteRule ^index\.php$ - [L]

      # add a trailing slash to /wp-admin
      RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

      RewriteCond %{REQUEST_FILENAME} -f [OR]
      RewriteCond %{REQUEST_FILENAME} -d
      RewriteRule ^ - [L]
      RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
      RewriteRule ^(.*\.php)$ $1 [L]
      RewriteRule . index.php [L]
      # END WordPress

  1. 保存并关闭文件。
**安全建议** : 如果修改或备份了  `.htaccess`  文件,一定要测试站点并观察是否有任何负面影响。最好定期备份  `.htaccess` ,以避免未来配置问题。

4. Apache 虚拟主机配置检查

请检查 Apache 虚拟主机配置文件,尤其确保对 80 端口到 443 的重定向是否配置正确。 如果 .htaccess 中规则无法完全解决, 需要进一步审查该配置文件,防止冲突。

  • 原理 : 虚拟主机配置不当(比如 HTTP 请求强制重定向到 HTTPS,但 HTTPS 端口配置缺失), 会导致 302 重定向死循环。

  • 操作步骤

    1. 找到你的 Apache 虚拟主机配置文件 (通常在 /etc/apache2/sites-available/ 目录下)。
  1. 确信配置了 80 端口到 443 的重定向。 并确保该配置只做 HTTP 到 HTTPS 的强制重定向。 示例配置如下:

    <VirtualHost *:80>
       ServerName site.domain
       DocumentRoot /var/www/html
       RewriteEngine On
      RewriteCond %{SERVER_NAME} =site.domain
       RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
    </VirtualHost>
    
    <VirtualHost *:443>
    DocumentRoot /var/www/html
    ServerName site.domain
    
      SSLCertificateFile /etc/letsencrypt/live/site.domain/fullchain.pem
     SSLCertificateKeyFile /etc/letsencrypt/live/site.domain/privkey.pem
     Include /etc/letsencrypt/options-ssl-apache.conf
    </VirtualHost>
    
    
3. 修改配置文件后需要重启Apache服务:

      ```bash
      sudo systemctl restart apache2
      ```

**安全建议** : 避免直接在生产环境上修改 Apache 的配置,最好先在测试环境中修改配置,确认正常工作后再同步到生产环境。 每次配置更改后需要重启服务以确保配置生效。

总结

解决 WordPress 多站点 ERR_TOO_MANY_REDIRECTS 错误通常涉及多方面的排查,从 WordPress 的基本 URL 设置到 CloudFlare 及服务器配置均要考虑。 理解问题发生的原理,结合上述的解决方案步骤,能帮你定位并解决此问题。 检查和修正 HTTPS 配置、wp-config.php.htaccess 文件、CloudFlare 设置及服务器虚拟主机配置等内容至关重要。