长轮询避免发送 OPTIONS 和 GET 组合 [Crossdomain]

Long-polling avoid sending OPTIONS and GET combined [Crossdomain]

我正在尝试完成对子域的长轮询调用。问题是我需要将请求从 example.com.

发送到子域 (sub.example.com)

我正在使用以下代码:

$.ajax({
    url: 'https://sub.example.com/sub',
    cache: false,
    headers: {
        'If-None-Match': etag,
        'If-Modified-Since': last_modified
    },
    success: function(data, status, headers) {
        // success handler
    },
    error: function(headers, status, errorThrown) {
        // error handler
    }
});

再说一遍,这段代码不在同一个域中。它位于 example.com.

这里的问题是浏览器首先发送一个OPTIONS请求,如果服务器响应OK,它会继续GET请求(这就是我们想要的)。但是,我想尽量避免第一个 OPTIONS 请求。

我可以在服务器设置中更改什么以允许这种情况发生吗?

使用数据类型 "jsonp" 不是一个选项。

您的 cross-origin 请求是 non-simple cross-origin 请求 因为您包含 non-simple headers If-None-MatchIf-Modified-Since。浏览器发送 OPTIONS 预检请求以获得在发送实际请求之前将 non-simple headers 发送到 cross-origin 资源的权限。

如果您不希望浏览器在 cross-origin 请求期间发送 OPTION 预检,您必须删除任何使其成为 non-simple 的组件,包括 non-simple headers.预检请求是 浏览器 而非服务器强加的要求。服务器没有办法告诉浏览器它不关心服务器是否使用预检请求,因为预检请求总是先来的,所以服务器必须与服务器通信的第一个机会是在响应预检请求本身。 (显然,在那个时候,说它不需要预检请求已经太晚了。)

有关预检机制的更多信息,您可以阅读 HTML5 Rocks page on CORS and the "Non-simple requests" section of my answer on How does Access-Control-Allow-Origin header work?