Access-Control-Allow-Origin tarafından kökene izin verilmiyor


337

Ben Ajax.requestbir Sencha Touch 2 uygulaması ( PhoneGap sarılmış ) uzak bir PHP sunucusuna yapıyorum .

Sunucudan gelen yanıt şudur:

XMLHttpRequest http://nqatalog.negroesquisso.pt/login.php dosyasını yükleyemiyor . Menüye http://localhost:8888Access-Control-Allow-Origin tarafından izin verilmez.

Bu sorunu nasıl düzeltebilirim?


19
jQuery kullanırken, ayar dataType: 'jsonp',hile yapar
amit

11
bu arada sunucudan gelen yanıt değildir. Kesin olarak, bu hata istemci tarafında verilir.
matteo

2
Jsonp hilesi muhtemelen artık çalışmıyor,
fyi

7
Bu hatayı kovalayarak sadece yarım gün harcadığım için dikkat edin - Sunucu tarafı komut dosyası bir iç sunucu hatasıyla başarısız olursa, tarayıcı isteğe izin verilmediği Access-Control-Allow-Origingibi yorumlayabilir ve bunu hata olarak bildirebilir.
troelskn

1
@troelskn Hayatımı yeni kurtardın. 3 günden beri bazı CORS hataları arıyordum ve yorumunuzu okuduktan sonra 5 dakika içinde çözdüğüm 500'e neden olan küçük bir Bahar yapılandırma sorunu oldu ve aslında aradım. Teşekkür ederim!
Alexis Dufrenoy

Yanıtlar:


378

Bu alanda bir süre önce Cross Domain AJAX adlı bir makale yazdım .

Yanıt veren sunucunun denetimine sahipseniz, bunu gerçekleştirmenin en kolay yolu, aşağıdakiler için bir yanıt başlığı eklemektir:

Access-Control-Allow-Origin: *

Bu, web alanları arası Ajax'a izin verir . PHP'de yanıtı aşağıdaki gibi değiştirmek istersiniz:

<?php header('Access-Control-Allow-Origin: *'); ?>

Header set Access-Control-Allow-Origin *Ayarı yalnızca Apache yapılandırmasına veya htaccess dosyasına koyabilirsiniz .

Bunun , kullanıcılarınızı saldırıya maruz bırakan CORS korumasını etkili bir şekilde devre dışı bıraktığına dikkat edilmelidir . Özellikle bir joker karakter kullanmanız gerektiğini bilmiyorsanız, kullanmamalısınız ve bunun yerine belirli alan adınızı beyaz listeye eklemelisiniz:

<?php header('Access-Control-Allow-Origin: http://example.com') ?>

4
Sunucu sağlayıcımla iletişime geçeceğim. Teşekkürler
Ricardo

8
Bununla ilgili herhangi bir güvenlik sorunu var mı? Bu yanıt , örneğin, "güvenlik nedeniyle JavaScript" aynı kaynak politikasıyla sınırlıdır "Örneğin, kötü amaçlı bir komut dosyası uzak bir sunucuyla bağlantı kuramaz ve sitenizden hassas veriler gönderemez."
JohnK

4
Harika, bunu sadece node.js sunucu dosyama koydum: response.writeHead (200, {'Content-Type': contentType, 'Access-Control-Allow-Origin': '*'}); Ve işe yaradı. Teşekkürler!
vbullinger

25
JohnK, evet, joker karakter herhangi bir alan adının barındırıcınıza istek göndermesine izin verecek. Yıldız işaretini, komut dosyalarını çalıştıracağınız belirli bir etki alanıyla değiştirmenizi öneririz.
Nick

7
Joker joker bile önerilmemesi gerektiğini düşünüyorum ilginç. Her şey hedefinize bağlıdır. Örneğin, joker karakteri kullanmamızın (ve bu yanıtı yayınlamamızın) nedeni, herhangi bir sitenin kullanması için gömülü bir pencere öğesi oluşturmamızdı.
Matt Mombrea

63

Eğer varsa yok sunucunun kontrole sahip, sadece Chrome başlatıcıya bu tartışmayı ekleyebilirsiniz: --disable-web-security.

Bu normal "web sörf" için kullanmak olmaz unutmayın. Referans olması için şu gönderiye bakın: Chrome'da aynı başlangıç ​​politikasını devre dışı bırakın .

Uygulamayı oluşturmak ve cihaza yüklemek için Phonegap'i kullandığınızda, bu bir sorun olmayacaktır.


Teşekkürler. Ancak uygulamam mobil cihazlarda çalışıyor, web görünümü sarmalayıcıma argüman gönderemiyorum.
Ricardo

Önce uygulamanızı bir tarayıcıda test etmiyor musunuz? Nasıl hata ayıklarsınız?
Travis Webb

Evet, bir Chrome tarayıcısında hata ayıkladım, ancak uygulama kromda çalışmaz. Kontrol edemem telefongap webview cadı olacak.
Ricardo

4
cevabı okuyun: Bu bağımsız değişkeni Chrome başlatıcısına kolayca ekleyebilirsiniz . Bunun içinde Chrome için bir ayar yok
Travis Webb

2
Tabii ki güvensiz. OP güvenlik önlemleri için bir yol istiyor.
Travis Webb

42

Apache kullanıyorsanız şunları ekleyin:

<ifModule mod_headers.c>
    Header set Access-Control-Allow-Origin: *
</ifModule>

yapılandırma. Bu, web sunucunuzdan gelen tüm yanıtların internetteki başka herhangi bir siteden erişilebilir olmasına neden olacaktır. Ana makinenizdeki hizmetlerin belirli bir sunucu tarafından kullanılmasına izin vermek istiyorsanız, *sunucunun kaynağını sunucunun URL'siyle değiştirebilirsiniz :

Header set Access-Control-Allow-Origin: http://my.origin.host

3
Ve modülü yüklemeyi unutmayın: a2enmod başlıkları
Walery

modül nasıl yüklenir: a2enmod başlıkları?
Ayesha

18

Bir ASP.NET / ASP.NET MVC uygulamanız varsa, bu üstbilgiyi Web.config dosyası aracılığıyla dahil edebilirsiniz:

<system.webServer>
  ...

    <httpProtocol>
        <customHeaders>
            <!-- Enable Cross Domain AJAX calls -->
            <remove name="Access-Control-Allow-Origin" />
            <add name="Access-Control-Allow-Origin" value="*" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

2
.NET MVC İnsanlar, buraya bak! Aslında bir çözüm yazacağım ve blogumda bu cevabı işaret edeceğim, böylece insanlar daha kolay bulabilirler. .NET / MVC engelini aşmaya çalışmaktan ve PHP / jQuery çözümlerinden başka bir şey bulmaktan daha kötü bir şey yok. Thanks @ Caio-Proiete
ottoflux

1
Nasıl oluyor bu benim için işe yaramıyor? Chrome kullanıyorum ve yerel ana bilgisayarımdan yahoo finans sayfasına erişmeye çalışıyorum.
newman

1
teşekkürler benim için çalıştı. Sunucu tarafı kod projesine (web.config) ekledim.
Mart'ta ethem

15

Bu, verilerimin kaynağı olarak ASP.NET MVC kullanarak aynı sorunu çözmeye çalışırken benim için ortaya çıkan ilk soru / cevaptı . Bunun PHP'yi çözmediğinin farkındayım sorusunu , ancak değerli olmak için yeterli olduğunu anlıyorum.

ASP.NET MVC kullanıyorum. Greg Brant gelen blog yazısı benim için çalıştı. Sonuçta, bir nitelik yaratırsınız,[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")] denetleyici eylemlerine ekleyebileceğiniz .

Örneğin:

public class HttpHeaderAttribute : ActionFilterAttribute
{
    public string Name { get; set; }
    public string Value { get; set; }
    public HttpHeaderAttribute(string name, string value)
    {
        Name = name;
        Value = value;
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.AppendHeader(Name, Value);
        base.OnResultExecuted(filterContext);
    }
}

Ve sonra onu kullanarak:

[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]
public ActionResult MyVeryAvailableAction(string id)
{
    return Json( "Some public result" );
}

1
WebApi 2'de şimdi yerleşik olarak bulunur. asp.net/web-api/overview/security/…
Matt Frear

10

Matt Mombrea sunucu tarafı için doğru olduğundan, reddi beyaz listeye ekleyen başka bir sorunla karşılaşabilirsiniz.

Phonegap.plist adresinizi yapılandırmanız gerekir. (Telefon aralığının eski bir sürümünü kullanıyorum)

Cordova için, adlandırma ve dizinde bazı değişiklikler olabilir. Ancak adımlar çoğunlukla aynı olmalıdır.

Önce Destek dosyaları> PhoneGap.plist'i seçin

resim açıklamasını buraya girin

ardından "ExternalHosts" altında

Belki de " http://nqatalog.negroesquisso.pt " değeri olan bir girdi ekleyin * sadece hata ayıklama amacıyla kullanıyorum.

resim açıklamasını buraya girin


8

Bu, bir yönlendirenin hem 'www' hem de 'www olmayan' sürümleri için bir istisna gerektiren herkes için kullanışlı olabilir:

 $referrer = $_SERVER['HTTP_REFERER'];
 $parts = parse_url($referrer);
 $domain = $parts['host'];

 if($domain == 'google.com')
 {
         header('Access-Control-Allow-Origin: http://google.com');
 }
 else if($domain == 'www.google.com')
 {
         header('Access-Control-Allow-Origin: http://www.google.com');
 }

ACAO hatasını azure ile çözme konusunda beni doğru yönde gösterdi. Googledrive'ın izin verilen ana bilgisayar adını eklerken. URL olması gerekmektedir kullanılır Google Drive DEĞİL Google Drive
Kildareflare

7

Size bunun için basit bir çözüm vereceğim. Benim durumumda bir sunucuya erişimim yok. Bu durumda , Access-Control-Allow-Origin'e izin vermek için Google Chrome tarayıcınızdaki güvenlik politikasını değiştirebilirsiniz . Bu çok basit:

  1. Bir Chrome tarayıcı kısayolu oluşturma
  2. Kısayol simgesini sağ tıklayın -> Özellikler -> Kısayol -> Hedef

Basit yapıştırın "C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-security.

Konum farklı olabilir. Şimdi bu kısayola tıklayarak Chrome'u açın.



6

Emin size API'sının temel URL'sini eklemiş Bu hatayı bir Chrome Uzantısı yazma ve elde ediyorsanız, o zaman edilmesi manifest.json'ın izinleri blok , örnek:

"permissions": [
    "https://itunes.apple.com/"
]


6

apache altındaysanız, dizine bu içeriğe sahip bir .htaccess dosyası ekleyin:

Header set Access-Control-Allow-Origin: *

Header set Access-Control-Allow-Headers: content-type

Header set Access-Control-Allow-Methods: *

5

In Ruby on , bir denetleyici içinde yapabilirsiniz:

headers['Access-Control-Allow-Origin'] = '*'

ajax çağrısı ise bunu hangi denetleyiciye koyarsınız? Daha fazla kod içeriği görebilir miyim?
rigdonmr

5

Üstbilgiyi içeren broswer'ı yaparak sunucuyu değiştirmeden çalışmasını sağlayabilirsiniz. Access-Control-Allow-Origin: *HTTP SEÇENEKLERİNİN yanıtlarındaki .

Chrome'da bu uzantıyı kullanın . Mozilla'daysanız bu cevabı kontrol edin .


5

Bunu Angular.js'de alırsanız, bağlantı noktası numaranızdan şu şekilde kaçtığınızdan emin olun:

var Project = $resource(
    'http://localhost\\:5648/api/...', {'a':'b'}, {
        update: { method: 'PUT' }
    }
);

Daha fazla bilgi için buraya bakın .


4

Aynı zamanda kromda test edilen telefon boşluğu uygulamasıyla da aynı sorun yaşıyoruz. Chrome'u açmadan önce her gün toplu iş dosyasının altında kullandığımız bir pencere makinesi. Bunu çalıştırmadan önce görev yöneticisinden tüm krom örneğini temizlemeniz gerektiğini veya arka planda çalışmamak için kromu seçebileceğinizi unutmayın.

BATCH: (cmd kullanın)

cd D:\Program Files (x86)\Google\Chrome\Application\chrome.exe --disable-web-security


0

İsteği aldığınızda şunları yapabilirsiniz:

var origin = (req.headers.origin || "*");

cevap vermek zorunda olduğunuz zamana göre böyle bir şeyle gidin:

res.writeHead(
    206,
    {
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Allow-Origin': origin,
    }
);
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.