【问题标题】:If-Modied-Since header makes CORS OPTIONS request failIf-Modified-Since 标头使 CORS OPTIONS 请求失败
【发布时间】:2015-11-24 16:52:02
【问题描述】:

在以下代码中,自定义标头 (If-Modified-Since) 使 ajax 失败,状态为 HTTP/1.1 405 Not Allowed 的 OPTIONS 预检请求。但是,如果我删除标头,请求会按预期工作(我不确定是否根本没有发送 OPTIONS 或开发控制台只是不显示它)。为什么会这样? (与 googleapis 托管 jquery 的情况相同)。

http = new XMLHttpRequest();
http.open('GET', 'http://code.jquery.com/jquery-2.1.4.min.js');
http.setRequestHeader('If-Modified-Since', 'Sat, 29 Oct 1994 19:43:31 GMT')
http.send();

另外,有没有办法将 xhr 中的这个标头发送到 jquery cdn 以获得304 响应状态?

【问题讨论】:

    标签: javascript ajax http-headers cors browser-cache


    【解决方案1】:

    听起来 Web 服务器说它不允许使用 OPTIONS 动词(方法)。要确认,请检查响应是否包含 Allow 标头(根据 HTTP 规范,它应该),如果是,它包含什么。如果它不包括OPTION——例如,如果它只是Allow: GET, HEAD, PUT,那么你的OPTIONS 请求总是会失败。因此,如果您想要做的事情依赖于使用 OPTIONS,那么它不适用于该服务器。

    根据 CORS 规范中的要求,设置 If-Modified-Since 标头(或 any other header except Accept, Accept-Language, Content-Language or a few Content-Type cases)会导致要求客户端进行预检;并且进行预检需要使用OPTIONS 方法。但是 CORS 规范和任何其他规范都没有要求所有 Web 服务器实际上必须支持 OPTIONS 方法;如果 Web 服务器没有,我想你会得到你在这里看到的那种响应。

    【讨论】:

    • Firefox 开发工具显示只有Server、Date、Content-Type、Content-Length、Connection 标头出现在响应中。我的问题的重点是,1)如果 OPTIONS 请求是跨域请求中的标准内容,为什么它不起作用? 2)为什么这种行为会根据设置 If-Modified-Since 标头而改变?
    • 1) 它不适用于任何不允许 OPTIONS 方法的服务器。在这种情况下,标准定义了客户端必须发送的内容,但并不要求每个 Web 服务器都必须实际允许 OPTIONS 方法。在 Web 服务器不支持它的情况下,您将获得与您看到的完全相同的结果,并且仍然符合规范。
    • 2) 设置自定义“作者”标头(任何标头由您作为作者添加,而不是Accept、Accept-Language、Content-Language 或少数@ 987654342@ case) 使请求得到预检(并且预检导致使用OPTIONS 方法)。
    • 抱歉,我花了一些时间来研究和理解该规范。
    猜你喜欢
    • 1970-01-01
    • 2018-01-27
    • 2012-10-01
    • 2012-11-01
    • 2015-03-28
    • 1970-01-01
    • 2016-12-10
    • 2016-04-02
    • 2011-07-02
    相关资源
    最近更新 更多