正如您提到的,可能是一个跨域政策问题。我通过添加以下内容解决了 1.5.6 上的这个问题以及跨域 cookie 问题(据我所知,它在任何版本上都无法正常工作):
xhrFields: { withCredentials: true },
在 AJAX 请求中以及access-control-allow-credentials
在接收标头上进行设置。这里的诀窍是,要使跨源标头以这种方式工作,您需要显式声明允许的 URL(即,Header set Access-Control-Allow-Origin "*"
将不起作用)。下一个技巧是您不想接受来自任何 URL 的这些标头。
为了解决这个问题,我在manual.php
控制器中添加了类似这样的东西 - 在 2.0+ 中将是api/order.php
(以及跨域 cookie 共享common/header.php
):
$this->load->model('setting/store');
$allowed[] = trim(HTTP_SERVER,'/');
$allowed[] = trim(HTTPS_SERVER, '/');
$stores = $this->model_setting_store->getStores();
foreach ($stores as $store) {
if ($store['url']) $allowed[] = strtolower(trim($store['url'],'/'));
if ($store['ssl']) $allowed[] = strtolower(trim($store['ssl'],'/'));
}
if (isset($this->request->server['HTTP_REFERER'])) {
$url_parts = parse_url($this->request->server['HTTP_REFERER']);
$origin = strtolower($url_parts['scheme'] . '://' . $url_parts['host']);
if (in_array($origin,$allowed)) {
header("access-control-allow-origin: " . $origin);
header("access-control-allow-credentials: true");
} else {
header("access-control-allow-origin: *");
}
} else {
header("access-control-allow-origin: *");
}
header("access-control-allow-headers: Origin, X-Requested-With, Content-Type, Accept");
header("access-control-allow-methods: PUT, GET, POST, DELETE, OPTIONS");
这基本上会创建一个包含所有可接受 URL 的数组,如果请求有效,它会明确设置 HTTP 标头以允许 cookie 和会话数据。这主要是对跨域 cookie 共享的修复,但我觉得它也可能有助于解决 2.0 api 问题。