从本地文件系统(Windows file:///) 发送 jQuery Ajax 请求

12

我试图使用ajax请求获取运行在Windows Wamp服务器上的"http://localhost/"的内容。

这个脚本是从如下路径运行的:

file:///C:/my/path/index.html

我只是使用了标准的$.ajax请求来尝试获取localhost的内容:

$.ajax({
          type: 'GET', 
          url: 'http://localhost/',
          success: function(data) {
            alert('success');
          }, error: function (data) {
            alert('failed');
          }
    });

不过我无法成功......似乎是本地文件系统或其他问题。我也不太确定。


1
尝试使用“/”作为URL,然后尝试使用“/index.html”。 - Adam Hopkinson
1
你能直接访问URL吗?在JS控制台中是否出现错误? - Adam Hopkinson
1
@adam - 是的,直接访问URL是可以的。我收到了这个错误 Uncaught TypeError: Property 'responseText' of object #<Object> is not a function 当我尝试使用http://时,也会出现这个错误 XMLHttpRequest cannot load http://localhost/. Origin null is not allowed by Access-Control-Allow-Origin. - Emmanuel
1
@Emmanuel 当你尝试从file:/// URL发起AJAX请求时,Chrome会给出第二个错误提示。 - lonesomeday
1
@lonesomeday - 是的,经过更多的谷歌搜索,我发现答案是设置Access-Control-Allow-Origin头。请看下面的帖子... - Emmanuel
@Emmanuel。为了澄清,您收到的错误消息不是Chrome的问题;Chrome会发出警告,但不会出现“无法加载”的错误。Chrome的消息将以“Unsafe JavaScript attempt to access frame with URL”开头。 - grantwparks
3个回答

17

问题解决了!

我只需要在我的 index.php 文件中添加以下代码头部即可访问http://localhost/

header('Access-Control-Allow-Origin: *');

感谢大家的帮助!


1
嗨Emmanual,我和你一样处于同样的情况。但我没有任何服务器代码,我使用了一个数据库代理服务器dbmojo 链接。我的脚本位于本地的file://目录中。现在我该怎么添加header('Access-Control-Allow-Origin: *');?还是有其他的解决方案吗? - iEamin
1
@iEamin 我不确定你的具体情况...或许可以通过你的Apache(.htaccess)或其他服务器配置文件添加"Access-Control-Allow-Origin"头文件?我不确定。我不知道其他实现跨服务器/协议请求的方法。 - Emmanuel

11

您说脚本是从 file:/// URL 运行的。最好不要从 file URLs 发出AJAX请求,因为它们的处理方式不一致。例如,Chrome 完全禁止它们。

然而,您在这里面临更大的问题是同源策略:您只能向与网页本身相同的主机发出AJAX请求。file:///http://localhost 不是同一主机(即使它们是同一台机器)。

最好将所有内容都放在http://localhost上运行。


3
很不幸,我认为你是对的 :(. 这可能对安全有好处,但对我的情况不利。 - Emmanuel

3
这可能行不通,因为浏览器会认为这是跨域请求。你通过 file:// URL 访问文件,但试图从 http://localhost 检索数据。尝试从 http://localhost 访问原始文件,它可能开始工作。

1
是的,从http://localhost访问它是可以的。但基本上我想用file:///脚本来检测wampserver是否正在运行,方法是发送一个ajax请求并检查结果。 - Emmanuel
1
@Emmanuel - 你上面的代码显示你使用了URL,但是在这里你说你正在使用文件路径。到底是哪一个? - Adam Hopkinson
2
@adam - ajax请求正在从file:///etc...运行,并尝试获取url http://:localhost/的内容。无论如何,下面是我的答案... - Emmanuel

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