什么是重定向循环?

重定向循环 就像一个“死胡同”,浏览器在访问某个网页时,被服务器不断地、无休止地在两个或多个 URL 之间来回“踢皮球”,永远也到达不了最终的目标页面。

dede此网页包含重定向循环
(图片来源网络,侵删)

这个过程是这样的:

  1. 浏览器请求访问 页面 A
  2. 服务器告诉浏览器:“请访问 页面 B”,这是一个 301 或 302 重定向。
  3. 浏览器遵从指令,请求访问 页面 B
  4. 服务器又告诉浏览器:“请访问 页面 A”,这也是一个重定向。
  5. 浏览器再次请求访问 页面 A……
  6. ……如此往复,形成了一个无限循环。

为了防止浏览器无限请求下去,浏览器通常会设置一个最大重定向次数(20 次),一旦超过这个次数,就会判定为“循环”,并显示这个错误提示,以保护浏览器性能和用户体验。


为什么会发生重定向循环?(常见原因)

重定向循环的根本原因在于 重定向规则设置不当,导致逻辑上形成了闭环,以下是一些最常见的原因,尤其是在使用 DedeCMS (织梦CMS) 时:

.htaccess 文件配置错误(最常见)

.htaccess 是 Apache 服务器上的一个配置文件,常用于设置 URL 重写(伪静态)和重定向规则,错误的规则是导致循环的“重灾区”。

dede此网页包含重定向循环
(图片来源网络,侵删)
  • 错误的伪静态规则:如果你修改了 DedeCMS 的伪静态规则,但规则中又错误地将所有请求(包括对 CSS、JS 图片等静态文件的请求)都重定向回首页或某个动态页面,就会形成循环。
  • 错误的域名或 HTTPS 重定向
    • 你想把 http://example.com 重定向到 https://example.com
    • 但你的 .htaccess 规则写错了,导致访问 https://example.com 时又被重定向回 http://example.com
    • 典型错误示例
      # 错误的写法,会导致 HTTP 和 HTTPS 之间循环
      RewriteEngine On
      RewriteCond %{HTTPS} off
      RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
      RewriteCond %{HTTPS} on
      RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • 错误的目录重定向:当你移动了网站目录(例如把网站根目录从 /public_html 移动到 /public_html/cms),但重定向规则没有写对,也可能导致循环。

CMS 系统内部配置错误(针对 DedeCMS)

DedeCMS 本身也有许多设置可以触发重定向。

  • 网站设置中的“站点根网址”错误
    • 在后台“系统” -> “系统基本参数” -> “核心设置”中,“站点根网址”填写错误,你把 https://www.example.com 写成了 http://www.example.com,而网站又开启了强制 HTTPS,就会导致循环。
  • “后台目录重定向”设置错误

    在后台“系统” -> “系统基本参数” -> “选项设置”中,如果设置了“后台目录重定向”,但填写的路径不正确,可能导致访问后台时循环。

  • 会员中心相关设置错误

    在“会员” -> “会员设置”中,会员中心的网址、登录跳转页等如果配置错误,也可能在用户登录或访问会员中心时触发循环。

  • 缓存问题
    • DedeCMS 有强大的缓存机制,如果你修改了配置,但没有清空缓存,那么网站仍然会使用旧的、错误的配置文件,导致问题依旧。

服务器或主机面板设置

  • PHP-FPM 或 FastCGI 缓存:一些服务器为了性能会开启缓存,如果缓存配置有误,可能会缓存重定向响应,导致循环。
  • 负载均衡器或 CDN 配置:如果你的网站使用了负载均衡器或 CDN 服务,它们上面的重定向规则如果和服务器上的规则冲突,也会导致循环。

如何排查和解决?(一步步指南)

遇到这个问题,不要慌,按照以下步骤冷静排查:

dede此网页包含重定向循环
(图片来源网络,侵删)

第 1 步:确认问题范围

  • 是否所有页面都循环? 如果是,很可能是 .htaccess 或网站根目录配置错误。
  • 是否只有特定页面(如首页、后台、会员中心)循环? 如果是,重点排查该页面相关的具体设置。

第 2 步:检查 .htaccess 文件(首要排查对象)

这是最可能的原因,通过 FTP 或文件管理器进入网站根目录,找到 .htaccess 文件。

  1. 备份:务必备份这个文件!
  2. 临时禁用:将 .htaccess 文件重命名为 .htaccess.bak 或其他名字,然后刷新页面,如果循环消失了,100% 是这个文件的问题。
  3. 分析规则:如果问题出在 .htaccess,请仔细检查里面的规则。
    • 检查伪静态规则:确保 DedeCMS 的伪静态规则是正确的,并且不会干扰静态文件,你可以参考 DedeCMS 官方或你所用主题的 .htaccess 示例。
    • 检查域名/HTTPS 规则:确保你的重定向规则是单向的,从 HTTP 到 HTTPS 的规则应该是这样的:
      RewriteEngine On
      RewriteCond %{HTTPS} off
      RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

      这个规则的意思是:“如果不是 HTTPS,就永久重定向到 HTTPS 的同一路径”,它不会反过来再重定向。

    • 检查目录规则:确保目录重定向的 RewriteBase 和目标路径是正确的。

第 3 步:检查 DedeCMS 后台设置

.htaccess 没问题,或者你修复了它但问题依旧,那么就要检查 CMS 内部设置了。

  1. 清空所有缓存
    • 登录 DedeCMS 后台。
    • 进入“系统” -> “系统设置” -> “一键更新网站缓存”,点击“更新所有缓存”。
    • 如果你有安装缓存插件,也一并清空。
  2. 检查核心参数
    • “系统” -> “系统基本参数” -> “核心设置”。
    • 核对“站点根网址”:确保它和你当前访问的域名、协议(HTTP/HTTPS)完全一致。
  3. 检查选项设置
    • “系统” -> “系统基本参数” -> “选项设置”。
    • 检查“后台目录重定向”等设置是否正确。
  4. 检查会员设置
    • “会员” -> “会员设置”。
    • 检查“会员中心主页”、“会员登录跳转页面”等 URL 是否正确。

第 4 步:检查浏览器和插件

  • 无痕/隐私模式:在无痕模式下访问网站,排除浏览器缓存或插件(如广告拦截器、VPN 扩展)的干扰。
  • 禁用插件:如果你安装了任何插件,尝试暂时禁用它们,看看问题是否解决,某些插件可能会错误地添加重定向规则。

第 5 步:检查服务器/主机环境

如果以上所有方法都无效,问题可能出在服务器层面。

  • 联系主机商:向你的主机提供商技术支持报告问题,并说明你已经尝试过的排查步骤,他们可以检查服务器配置、PHP-FPM 缓存、CDN 设置等。
  • 检查 CDN:如果你使用了 Cloudflare、阿里云 CDN 等,登录其控制台,检查“规则”或“缓存”设置,看是否有错误的重定向规则。

排查清单

检查区域 具体操作
初步判断 确定是所有页面循环还是特定页面循环。
.htaccess 文件 【最关键】 备份并临时重命名该文件,测试问题是否消失,如果消失,仔细分析其规则。
DedeCMS 后台 【第二关键】 彻底清空所有缓存,然后核对“站点根网址”等核心参数和选项设置。
浏览器环境 使用无痕模式访问,并尝试禁用浏览器插件。
服务器环境 如果以上都无效,联系主机商或检查 CDN/负载均衡配置。

对于 DedeCMS 90% 的重定向循环问题都源于 .htaccess 文件配置错误或后台“站点根网址”与实际访问地址不匹配,请务必从这两点开始重点排查。