Я пишу веб-приложение для некоторой службы, используя RESTful API. API доступен в https://api.example и приложении https://app.example. Простые запросы GET, использующие CORS, отлично работают в Chrome и Firefox. Некоторые методы принимают данные через POST и возвращают код 303 с новым uri в заголовке местоположения.
Запросить предварительный запрос OPTIONS:
Request Method:OPTIONS
Status Code:200 OK
Заголовок запроса
Accept:*/*
Accept-Charset:UTF-8,*;q=0.5
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,ru;q=0.6
Access-Control-Request-Headers:origin, authorization, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
DNT:1
Host:api.example
Origin:https://app.example
Referer:https://app.example/app/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.32 (KHTML, like Gecko) Chrome/27.0.1425.0 Safari/537.32 SUSE/27.0.1425.0
Заголовки ответов
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:Authorization, Content-Type
Access-Control-Allow-Methods:GET,POST,PUT,DELETE,HEAD,OPTIONS
Access-Control-Allow-Origin:https://app.example
Access-Control-Expose-Headers:*
Access-Control-Max-Age:3628800
Connection:keep-alive
Content-Length:0
Date:Sun, 05 May 2013 15:22:50 GMT
Server:nginx/1.2.5
Затем фактический запрос просто остановится после получения 303:
Request URL:https://api.example
Request Method:POST
Status Code:HTTP/1.1 303 See Other
Заголовки ответов:
Server:nginx/1.2.5
Location:https://api.example/some_url
Date:Sun, 05 May 2013 15:27:49 GMT
Content-Type:application/json
Content-Length:0
Connection:keep-alive
Access-Control-Max-Age:3628800
Access-Control-Expose-Headers:*
Access-Control-Allow-Origin:https://app.example
Access-Control-Allow-Methods:GET,POST,PUT,DELETE,HEAD,OPTIONS
Access-Control-Allow-Headers:Authorization, Content-Type
Access-Control-Allow-Credentials:true
Пользовательский агент RFC должен следовать переадресации, но Chrome и FF, похоже, не ведут себя так, как ожидалось. Это ошибка браузера, или я делаю что-то неправильно?
update: Если я начинаю хром с -disable-web-security, все работает нормально.