2011-01-17 1 views
3

Привет,CORS/xhr.getRequestHeaders

Я пытаюсь использовать CORS (http://www.w3.org/TR/2009/WD-cors-20090317/#access-control-allow-methods-header) для приложения на сафари, и когда я пытаюсь читать заголовки ответа от XMLHTTPRequest, я только получить Content-Type. Ни один из других вполне стандартных заголовков не проходит, и я не могу понять, как заставить это работать.

Кто-нибудь, возможно, узнает, как исправить эту проблему? Может ли это быть ошибкой WebKit?

Редактировать

здесь конфиг я использую с Nginx:

add_header Access-Control-Allow-Origin *; 
add_header Access-Control-Allow-Headers Cache-Control,Pragma,Date; 
add_header Access-Control-Allow-Methods GET,POST; 
+0

Что вы используете для вашего сервера? Я делаю это с помощью Ruby и Sinatra без проблем, хотя сначала его настроить было немного сложно. – Hemlock

+0

nGinx. Заголовок даты присутствует, и я обновляю свой вопрос с текущей конфигурацией. –

+0

Я подозреваю, что это первая проблема, с которой вам придется работать: http://stackoverflow.com/questions/227939/handling-options-request-in-nginx. Предполетный полет не будет работать. Вы можете получить базовую работу GET, если убедитесь, что X-заголовки не отправлены. – Hemlock

ответ

0

Подтвердили ли вы, что ваш сервер фактически испуская Cache-Control, Pragma и даты заголовки? Возможно, настроили трассировку Wireshark на клиенте, чтобы увидеть фактические HTTP-заголовки, которые обмениваются?

+0

Заголовка даты выходит, что является единственным, о котором я беспокоюсь в данный момент. Но он не проходит через JS; доступен только заголовок Content-type, все остальные обращения к заголовкам помечены как небезопасные. –

1

Для того, чтобы заголовки предоставлялись JS, вам необходимо установить Access-Control-Expose-Headers header в список заголовков, разделенных запятыми, которые вы хотите открыть.

К сожалению, этот заголовок плохо поддерживается. Mozilla только реализовал его в Firefox 4, Webkit с этого момента еще does not implement it. Я не уверен в IE8 и выше (у Google не появилось ничего полезного, и у меня их нет, чтобы проверить себя).

(смотри также, например. Restrictions of XMLHttpRequest's getResponseHeader()?)

+0

Должен был обновить вопрос с этой информацией ... Я нашел это в то время и просто стал ленивым: S Однако я * думаю *, что это не сработало, когда мы его попробовали. Я попробую в ближайшее время и посмотрю, что произойдет. –

0

Я был в такой же ситуации вчера. https://stackoverflow.com/users/713326/gijs дал вам правильный ответ, но есть еще одна деталь, характерная для nginx, которую вы должны позаботиться. «Добавить заголовок» работает только в том случае, если ответ от службы успешно (200, 204, 301, 302 или 304). Вы должны сделать пользовательскую сборку nginx, чтобы включить HttpHeadersMoreModule (http://wiki.nginx.org/HttpHeadersMoreModule). После замены add_header с more_set_headers.

Пример:

more_set_headers 'Access-Control-Allow-Origin: $http_origin'; 
    more_set_headers 'Access-Control-Allow-Credentials: false'; 
    more_set_headers 'Access-Control-Allow-Methods: GET, POST, OPTIONS, HEAD, PUT, PATCH, DELETE'; 
    more_set_headers 'Access-Control-Allow-Headers:Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Accept,Authorization; 
    more_set_headers 'Access-Control-Expose-Headers: Location'; 
0

ЗАПРОС:

$.ajax({ 
      url: "http://localhost:8079/students/add/", 
      type: "POST", 
      crossDomain: true, 
      data: JSON.stringify(somejson), 
      dataType: "json", 
      success: function (response) { 
       var resp = JSON.parse(response) 
       alert(resp.status); 
      }, 
      error: function (xhr, status) { 
       alert("error"); 
      } 
     }); 

ОТВЕТ:

response = HttpResponse(json.dumps('{"status" : "success"}')) 
response.__setitem__("Content-type", "application/json") 
response.__setitem__("Access-Control-Allow-Origin", "*") 

return response 

 Смежные вопросы

  • Нет связанных вопросов^_^