Перекрестный источник ресурсов (CORS) с nginx /chrome

У меня есть сайт со следующей сегментацией:

api.example.com 
developers.example.com 
example.com

Я хотел бы разрешить как example.com, так и developers.example.com, чтобы сделать запросы AJAX api.example.com.

Моя конфигурация nginx до сих пор для api.example.com, которая является приложением для стойки, обслуживаемой единорогом, выглядит следующим образом:

upstream app_server {
  server unix:/tmp/api.example.com.sock fail_timeout=0;
}

server {
       listen 80;
       server_name api.example.com;
       access_log /home/nginx/api.example.com/log/access.log;
       error_log /home/nginx/api.example.com/log/error.log;
       location / {
         add_header 'Access-Control-Allow-Origin' 'http://example.com,http://developers.example.com';
         add_header 'Access-Control-Allow-Credentials' 'true';
         add_header 'Access-Control-Allow-Headers' 'Content-Type,Accept';
         add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';

         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header Host $http_host;
         proxy_redirect off;
         proxy_pass http://app_server;
       }

}

Основываясь на моем чтении, этого должно быть достаточно для того, что я пытаюсь сделать.

Ответ OPTIONS :

HTTP/1.1 200 OK
Server: nginx/0.7.67
Date: Sat, 28 Apr 2012 17:20:08 GMT
Content-Type: application/json
Connection: close
Status: 200 OK
Content-Length: 0
Access-Control-Allow-Origin: http://developers.example.com,http://example.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type,Accept
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE

Но когда я пытаюсь выполнить следующие действия в консоли Chrome:

$.ajax("http://api.example.com", {
  type: 'get',
  contentType: "application/json",
  accept: "application/json"
}).success(function(data){
  console.log("success!", data);
}).fail(function(jqxhr, statusText){
  console.log("fail!", jqxhr, statusText);
})

Я вижу:

XMLHttpRequest cannot load http://api.example.com/. Origin
http://developers.example.com is not allowed by Access-Control-Allow-Origin.

И то же самое для http://example.com .

Что мне не хватает?

Если я установил Access-Control-Allow-Origin в *, то я вижу:

HTTP/1.1 200 OK
Server: nginx/0.7.67
Date: Sat, 28 Apr 2012 17:28:41 GMT
Content-Type: application/json
Connection: close
Status: 200 OK
Content-Length: 0
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type,Accept
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE

Но запрос jQuery по-прежнему терпит неудачу, поскольку хром также подчеркивает, что пролетный OPTIONS не удалось (хотя он возвратил 200 OK)

12 голосов | спросил John Ledbetter 28 PMpSat, 28 Apr 2012 21:30:29 +040030Saturday 2012, 21:30:29

2 ответа


15

В соответствии с спецификацией CORS несколько источников должны быть разделены пробелами, а не запятые, как вы использовали, поэтому попробуйте отправить этот заголовок:

Access-Control-Allow-Origin: http://developers.example.com http://example.com

документация Mozilla не упоминает несколько истоков, поэтому, если это еще не работа попытка только отправка:

Access-Control-Allow-Origin: http://developers.example.com

Если это работает, вам нужно настроить nginx или ваш сервер приложений, чтобы вернуть заголовок Access-Control-Allow-Origin, содержащий значение Origin, отправленный клиентом, если он соответствует разрешенному списку. Что-то вроде следующей (непроверенной) конфигурации nginx могло бы сделать это:

if ($http_origin ~ "^(http://developers.example.com|http://example.com)$") {
    add_header "Access-Control-Allow-Origin" $http_origin;
}
ответил mgorven 1 Mayam12 2012, 09:53:43
4

Использование if в location в конфигурации nginx следующим образом:

if ($http_origin ~ "^(http://developers.example.com|http://example.com)$") {
    add_header "Access-Control-Allow-Origin" $http_origin;
}

Причините nginx, чтобы делать странные вещи. В частности, proxy_pass и try_files не делать работайте, как ожидалось. Подробнее см. http://wiki.nginx.org/IfIsEvil .

ответил Anthony Moralez 11 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 11 Sep 2014 23:25:56 +0400 2014, 23:25:56

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132