jquery 2.0.2 に問題があり、API を呼び出すときに HTTP 403 ステータス コードを特定するのに苦労しています (呼び出し元の静的 Web ページと同じように、同じマシンでホストされています)。Web ページの JavaScript から、/sessions ルートに対して $.ajax GET を実行して、ユーザーの Cookie が現在設定されているかどうかを確認しています。
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 は以下に同意します。
ただし、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 の設定を誤ったのでしょうか、それとも何らかの方法で誤用したのでしょうか? ここにトリックはありますか?