6

我无意中写了一个对NextBus的跨域 AJAX 调用(使用 jQuery):

$.ajax({
      url: 'http://webservices.nextbus.com/service/publicXMLFeed?command=predictions&a=sf-muni&r=1&s=6294',
      dataType: 'xml',
      success: function(data) {
           do_stuff();
      }
});

问题是,它适用于所有浏览器,尽管来自不同的域。鉴于单一来源政策,为什么这实际上有效?

该页面在这里:http://sftransitfirst.org/F/,从下拉菜单中选择一个停止会触发 ajax。

正如预期的那样,对Google Maps API Web Services进行类似的调用会失败Origin ... is not allowed by Access-Control-Allow-Origin(并且它不支持 jsonp)。

4

2 回答 2

11

他们必须通过以下方式明确允许跨域访问:

<?php header('Access-Control-Allow-Origin: *'); ?>

或者使用 htaccess:

<ifModule mod_headers.c>
    Header set Access-Control-Allow-Origin: *
</ifModule>
于 2012-08-28T15:37:29.630 回答
5

许多现代 Web API 支持跨域资源共享(CORS)。CORS 是一种让网站自愿将其页面提供给跨域脚本的方法。来自服务器的Access-Control-Allow-OriginHTTP 标头向您的 Web 浏览器发出信号,表明允许脚本使用 Ajax 访问页面是可以的,即使脚本在不同的源上运行也是如此。如果服务器不提供 CORS 标头,您的浏览器将照常执行 SOP。

大多数 API 选择将其页面公开给跨域脚本,因为他们知道几乎所有用户都希望能够通过 Ajax 从他们自己的域访问 API。

于 2012-08-28T15:45:54.780 回答