长时间轮询可避免发送OPTIONS和GET组合[跨域]

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

本文关键字:组合 GET 跨域 OPTIONS 可避免 长时间      更新时间:2023-09-26

我正在尝试完成对子域的长轮询调用。问题是我需要将请求从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请求,如果服务器响应正常,它将继续发送GET请求(这正是我们想要的)。然而,我想尽量避免第一次OPTIONS请求。

我可以在服务器设置中更改什么吗?

不能选择使用数据类型"jsonp"

您的跨源请求是一个非简单跨源请求,因为您包含了非简单标头If-None-MatchIf-Modified-Since。浏览器在发送实际请求之前,发送OPTIONS preflight请求以获得向跨源资源发送非简单标头的权限。

如果您不希望浏览器在跨原点请求期间发送OPTION预飞行,则必须删除任何使其不简单的组件,包括不简单的标头。飞行前请求是浏览器强加的要求,而不是服务器。服务器没有办法告诉浏览器它不在乎服务器是否使用飞行前请求,因为飞行前请求总是第一位的,所以服务器必须与服务器通信的第一个机会是对飞行前请求本身的响应。(显然,在这一点上,说它不需要飞行前请求已经太晚了。)

有关飞行前机制的更多信息,你可以阅读CORS上的HTML5 Rocks页面和我关于访问控制允许起源标题如何工作的回答中的"非简单请求"部分?