XMLHttpRequest使用相对路径发送失败

4
我遇到一些可能很基础的问题。我在开发一个没有服务器的网站。但是,当我尝试通过XMLHttpRequest访问文件时,遇到了问题。
如你所见,在示例代码片段中,我创建变量,使用相对路径打开所需文件,并使用send函数。
如果我使用需要向上遍历到父目录的相对路径,send()函数就会失败。但是,如果我提供一个与网页处于同一目录或当前网页目录下子文件夹中的路径,则可以看到XMLHttpRequest成功返回。在这些成功的情况下,我可以在request.responseText中看到测试文件的数据。
非常感谢你提供任何帮助。
我现在唯一的线索是可能存在安全威胁,阻止遍历上级目录的“get”请求。
谢谢。
代码片段:
function test(){
    var request = new XMLHttpRequest();
    request.open('GET', "../test.txt", true);
    request.send();//FAILS HERE

    //Get Response
    var response = request.responseText;
}

function test2(){
    var request = new XMLHttpRequest();
    request.open('GET', "test.txt", true);
    request.send();
    //Get Response
    var response = request.responseText; //SUCCESSFUL
}

为什么不安装像Apache/IIS这样的本地服务器呢?这将解决您的问题。很可能是浏览器出于安全考虑不允许这样做。 - geedubb
2个回答

2
MDN网站上关于Gecko引擎和Firefox浏览器的介绍:

一个文件只有在其父目录是目标文件的祖先目录时才能读取另一个文件。

其他浏览器也存在类似的规则。这是file:///协议的限制,它有很好的原因。试图打破它是没有意义的。解决方案是在计算机上运行本地服务器,这并不难做。
为了澄清:假设您的文件结构如下:
- file1.html
- dir1/
  - file2.html
- dir2/
  - index.html
  - file3.html
  - dir3/
    - file4.html

index.html 中,可以使用 JavaScript 访问 file3.htmlfile4.html,但无法访问 file1.htmlfile2.html

首先,该链接已不再有效。 其次,如果我想发送包含 a/b/.. 的 URL 到后端,但由于 .. 被发送为 a/,那么这个答案就没有帮助了。 - ElectRocnic
@ElectRocnic 为什么你想要发送 a/b/..?这意味着 a/:这就是URI的工作原理。(遗憾的是链接已经失效了:我不知道这些信息现在是否过时。无论如何,我认为这与你的问题无关,因为它听起来你并没有使用 file:/// URI。) - lonesomeday
是的,我正在使用普通的http请求URL。 我不想回答你的问题,但我们的代码允许它,并且我们正在寻找一种将..原样传递到后端的方法。即使使用%2e%2e,浏览器似乎也会应用路径遍历,而不仅仅是将URL作为字符串传递。 - ElectRocnic

0

直接使用文件->打开在浏览器中打开文件,然后复制地址栏中的URL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接