我正在尝试完成对子域的长轮询。问题是我需要将请求发送到sub.example.com
的子域(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"不是一种选择。
答案 0 :(得分:1)
您的跨源请求是非简单的跨源请求,因为您包含非简单标头If-None-Match
和If-Modified-Since
。浏览器发送OPTIONS预检请求以获取在发送实际请求之前将非简单标头发送到跨源资源的权限。
如果您不希望浏览器在跨源请求期间发送OPTION预检,则必须删除任何使其不简单的组件,包括非简单标头。预检请求是浏览器而非服务器强加的要求。服务器无法告诉浏览器它不关心服务器是否使用预检请求,因为预检请求始终是第一个,因此服务器与服务器通信的第一个机会是响应预检请求本身。 (显然,在那时,说它不需要预检请求已经太晚了。)
有关预检机制的更多信息,您可以阅读HTML5 Rocks page on CORS和"非简单请求"关于How does Access-Control-Allow-Origin header work?
的答案部分