定时检测Redirect.txt引发网页重定向循环问题求助
问题分析与修复方案
核心问题点
- 定时器调用错误:
setInterval(read_redirect(), 5000)里的read_redirect()会立即执行函数,且定时器实际接收的是函数返回值(undefined),导致定时器无法按预期每5秒执行一次。 - no-cors模式导致无法读取响应:使用
mode: "no-cors"时,fetch返回不透明响应(opaque response),无法调用response.text()获取文件实际内容,最终data为空字符串,触发错误的重定向逻辑。 - 未处理空内容与初始值问题:
usedLink初始为undefined,当textData为空时,textData != usedLink判断为真,会触发重定向到空地址(即当前页面),造成无限刷新。
修复后的代码
let usedLink = ""; // 修正定时器:传入函数引用,而非立即执行 const redirectTimer = setInterval(read_redirect, 5000); function read_redirect(){ const url = `${SERVER_HOST}/Redirect.txt`; // 移除no-cors模式,确保能读取响应内容 fetch(url) .then(response => { // 先判断响应是否成功 if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return response.text(); }) .then(data => { const textData = data.trim(); // 去除首尾空白字符,避免换行/空格干扰 console.log(`读取到内容: ${textData}`); // 增加非空判断,仅当内容有效且未使用过时才重定向 if (textData !== "#" && textData !== "" && textData !== usedLink) { usedLink = textData; console.log(`即将重定向到: ${usedLink}`); // 重定向前清除定时器,避免新页面继续执行(同域名下) clearInterval(redirectTimer); location.href = textData; } }) .catch(error => console.error("读取重定向文件失败:", error)); }
额外说明
- 如果存在跨域问题,需要在托管
Redirect.txt的服务器端配置CORS允许当前域名访问,而非使用no-cors模式。 - 加入
trim()是为了避免文件中的换行、空格等空白字符导致判断错误。 - 重定向前清除定时器,防止同域名下的新页面继续执行定时任务。
内容的提问来源于stack exchange,提问作者rani ynon
相关产品推荐
相关产品推荐

