jQuery返回状态代码404而不是403

时间:2013-07-07 06:05:02

标签: ajax jquery coffeescript xmlhttprequest

我在使用jquery 2.0.2时遇到问题,并在调用我的API时识别HTTP 403状态代码(托管在同一台机器上,就像调用来自的静态网页一样)。从网页的javascript中,我正在针对/ sessions路由进行$ .ajax GET以检查用户的cookie当前是否已设置,如果没有这样的cookie或者它是无效的,则期望403。

正在通过以下调用提前设置Ajax:

  setupAjax: ->
    $.ajaxSetup(
      dataType: 'json'
      xhrFields:
        withCredentials: true)

对于未经身份验证的用户,API(下面的nginx反向代理日志)正确返回403:

127.0.0.1 - - [06/Jul/2013:22:48:25 -0700] "GET /1/sessions HTTP/1.1" 403 33 "https://foo.localhost.com/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0"

Firefox同意:

enter image description here

然而,当调用jQuery的xhr错误处理程序时,xhr.status代码由于某种原因总是404,这会完全抛弃逻辑。例如,假设我使用下面的CoffeeScript调用,只有404处理程序被调用,如果我给它一个正确的路由或甚至一个不存在的路由(在服务器日志和Firefox中正确返回404)

  checkSessionCookie: ->
    $.ajax(
      url: "#{@baseUrl}/sessions"
      type: 'GET'
      statusCode:
        403: -> console.log "I'm a 403"
        404: -> console.log "I'm a 404")

(在控制台中转储xhr对象):

Object { readyState=4, status=404, statusText="error"}

这里发生了什么?我是否错误配置了jQuery,或者我是否以某种方式滥用它?这里有诀窍吗?

1 个答案:

答案 0 :(得分:0)

基于一些实验,似乎Firefox可能已经吞噬了导致错误状态的CORS异常。 Chrome总是报告CORS调用,这就是我用Firefox测试它的原因。

在服务器上设置CORS标头使Firefox正确返回403。