【问题标题】:Webkit browsers will not allow me to set CORS preflight headers [duplicate]Webkit 浏览器不允许我设置 CORS 预检标头 [重复]
【发布时间】:2013-07-27 22:11:28
【问题描述】:

我正在尝试使用 jQuery.ajax() 创建一个跨源 GET 请求。我的服务器配置为接受此类请求。 Chrome 不允许我发送标头:

访问控制请求方法

访问控制请求标头

拒绝设置不安全的标头“Access-Control-Request-Method”

这是我的 ajax 请求:

$.ajax({
    type:"GET",
    headers: {
        'Access-Control-Request-Method' : 'GET',
        'Access-Control-Request-Headers': 'X-Custom'
    },      
    url: "http://localhost:3000",       
    success: function(msg) {
        console.log(msg);
    }
});

我希望这些标头会导致浏览器创建一个飞行前请求 (OPTIONS) 以与服务器进行协商。我知道我以前已经做到了。谁能告诉我我忘记了什么?

非常感谢!

【问题讨论】:

  • Access-Control-Expose-Headers 设置为任意值,例如 x-json
  • 什么?那不是我要发送的标题。能详细点吗?
  • 这是一种解决方法。您会看到,当您要发出跨域请求时,会建立预检请求。预检将检查服务器是否有可用的OPTIONS,并返回相应的标头。在预检完成之前,请求不会在基于 webkite 的浏览器中解析,以避免跨站点伪造。 You can read more about it here
  • 我知道什么是 CORS 以及预检请求是如何工作的。我不明白为什么要发送 Access-Control-Expose-Headers 标头。 Webkit 是否有不允许标准 CORS 标头的补丁?
  • @Nick - 你能用你最终设置的内容更新你的代码吗?

标签: javascript jquery cors


【解决方案1】:

如果请求不是简单请求,则跨域请求会自动发生 PREFLIGHT 选项请求。一个简单的请求通常是一个 GET 请求。因此,如果您发出跨域 GET 请求,则不会有预检 OPTIONS 请求。

但是,如果您发出跨域 POST 请求,浏览器将在没有您指示的情况下首先发出预检 OPTIONS 请求。此请求的目的是查看服务器是否允许来自您客户端的域/IP 的跨域 POST 请求。

如果您的服务器在响应中具有正确的“访问控制”标头,也就是说,是的,允许此客户端发出跨域 POST 请求,那么浏览器将继续发出 POST 请求。如果您的服务器拒绝(因为您服务器上的“访问控制”标头错误),那么浏览器将尊重这一点并且不会发出第二个 POST 请求。

请参阅https://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request 了解更多信息。

此外,您必须确保您的服务器已设置为处理传入的 OPTIONS 请求。

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2023-03-14
    • 2020-09-30
    • 2021-05-27
    相关资源
    最近更新 更多