Nginx / chrome ile Çapraz Kaynak Kaynağı Paylaşımı (CORS)


13

Aşağıdaki segmentasyona sahip bir web sitem var:

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

Her ikisine de izin vermek example.comve developers.example.comAJAX istekleri yapmak istiyorum api.example.com.

api.example.comUnicorn tarafından sunulan bir Rack uygulaması olan şu ana kadar nginx yapılandırmam şöyle görünüyor:

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;
       }

}

Okumama dayanarak, bu yapmaya çalıştığım şeyler için yeterli olmalı.

SEÇENEKLER tepki:

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

Ancak Chrome konsolunda aşağıdakileri denediğimde:

$.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);
})

Anlıyorum:

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

Aynı şey http://example.com için de geçerlidir .

Neyi kaçırıyorum?

Ben ayarlarsanız Access-Control-Allow-Originiçin *o zaman bakın:

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

Ancak jQuery isteği hala başarısız oluyor, krom da uçuş öncesi OPTIONSbaşarısız olduğunu vurguladı (geri dönmesine rağmen 200 OK).

Yanıtlar:


17

CORS spesifikasyonuna göre, çoklu kökenler kullandığınız gibi virgüllerle değil boşluklarla ayrılmalıdır, bu nedenle bu başlığı göndermeyi deneyin:

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

Mozilla belgeleri o hala sadece gönderen iş denemek değil eğer öyleyse, gerçi birden kökenlerini söz etmez:

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

Bu işe yararsa, nginx veya uygulama sunucunuzu , izin verilen listeyle eşleşiyorsa istemci tarafından gönderilen üstbilginin Access-Control-Allow-Origindeğerini içeren bir üstbilgi döndürecek şekilde yapılandırmanız gerekir Origin. Aşağıdaki (denenmemiş) nginx yapılandırması gibi bir şey bunu yapabilir:

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

Bu yaptığım işin bir parçası. Ayrıca Access-Control-Allow-Headerüstbilgiyi kaldırdım ve jQuery çağrımı şu şekilde değiştirdim: $.ajax("http://api.example.com", { type: 'get', crossDomain: true}) Bu, OPTIONSön kontrolün hiç olmasını engelledi .
John Ledbetter

1
NOT: Verilen çözüm sizin için işe yaramıyorsa, bunu ve bunu okuyun . Bu aydınlatıcıdır ve çalışma nedenini bulabilirsiniz.
its_me

4

Bir Kullanarak ifBir de locationböyle bir nginx konfigürasyonda bloğun:

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

Nginx'e garip şeyler yap. Özellikle, proxy_passve try_filesbeklendiği gibi çalışmaz. Daha fazla bilgi için http://wiki.nginx.org/IfIsEvil adresine bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.