You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用XMLHttpRequest本地file://请求遇Chrome和Firefox问题咨询

本地file://协议下XMLHttpRequest的两个浏览器问题解答

我来帮你拆解这两个本地文件请求的问题,都是浏览器针对file://协议的特殊处理机制,不是Bug哦:

针对Chrome的status始终为0问题

你已经加了--allow-file-access-from-files参数,XHR能成功获取本地文件内容,但this.status一直是0,核心原因是:file://不是HTTP协议。

Chrome不会为本地文件请求返回标准的HTTP状态码(比如200)——毕竟没有后台HTTP服务器来处理请求、生成状态码。当readyState变为4时,只要responseText有有效内容,就说明请求已经成功了。

你的代码里只判断status == 200会漏掉这种本地场景,建议修改判断逻辑兼容两种情况:

xhttp.onreadystatechange = function() {
  if (this.readyState == 4) {
    // 兼容HTTP请求(status=200)和本地file请求(status=0但有响应内容)
    if (this.status == 200 || (this.status == 0 && this.responseText)) {
      elmnt.innerHTML = this.responseText;
    } else if (this.status == 404) {
      elmnt.innerHTML = "Page not found.";
    } else {
      elmnt.innerHTML = "请求失败";
    }
  }
}

针对Firefox的XML解析错误问题

Firefox返回200状态码,但遇到<script> alert(-1<1); </script>时报错,这不是浏览器Bug,是XML解析的标准语法规则导致的:

当你用XHR请求本地文件时,如果Firefox默认把响应识别为XML(比如文件后缀是.xml,或者浏览器未明确判断为纯文本),XML语法要求所有<符号要么是标签的开始,要么必须转义成&lt;。你脚本里的-1<1中的<没有转义,XML解析器会误以为这是新标签的开始,直接触发语法错误。

解决方法有两种:

  1. 强制XHR以纯文本方式解析响应,跳过XML语法检查:
xhttp.open("GET", file, true);
xhttp.responseType = "text"; // 新增这行,指定响应类型为纯文本
xhttp.send();
  1. 调整被请求文件的脚本内容,用CDATA块包裹代码,告诉XML解析器这段是纯文本无需解析:
<script><![CDATA[ alert(-1<1); ]]></script>

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:24:36