İstenen kaynakta 'Access-Control-Allow-Origin' başlığı yok. '…' Kaynağının bu nedenle erişime izin verilmiyor


135

URL'leri yeniden yazmak için .htaccess kullanıyorum ve çalışmasını sağlamak için html base etiketi kullandım.

Şimdi, bir ajax isteği yapmaya çalıştığımda aşağıdaki hatayı alıyorum:

XMLHttpRequest yüklenemiyor http://www.example.com/login.php. İstenen kaynakta 'Access-Control-Allow-Origin' başlığı yok. http://example.comBu nedenle ' ' kaynağına erişim izni verilmiyor.


1
Boşver ... şu anda çalışıyor, hatanın ne olduğunu bile bilmiyorum: S
Th3lmuu90

8
İnce olmasına rağmen , hatadan farklıhttp://wordicious.com bir alandır . Btw, şimdi çalışıyorsa ve kendi başına geri döndüyse, muhtemelen soruyu silmelisiniz. http://www.wordicious.com/
acdcjunior

@acdcjunior Bu, sizin açınızdan zekice bir gözlem olan bir hata gibi görünüyor. Eğer bunu cevap olarak gönderirseniz, onu değerlendiririm.
Waleed Khan

5
Sorunun silinmediği iyi bir şey, yoksa bugün göremezdim!
icedwater

Yanıtlar:


170

Kullanım Yöntemi addHeaderkullanmak yerine setHeader,

response.addHeader("Access-Control-Allow-Origin", "*");

*yukarıdaki satır izin verir access to all domains.


İzin vermek için access to specific domain only:

response.addHeader("Access-Control-Allow-Origin", "http://www.example.com");

Bunu kontrol et blog post.


4
tanımlanmamış addheader gösteriyor. Lütfen açıklayabilir misiniz?
Vaisakh Pc

9
Bu çizgileri nereye koyacağım?
DaveWalley

14
Bu nereye eklenmelidir?
Alex

1
Bu blog yazısı Node.js ve express hakkında konuşuyor. İstemci tarafı javascript değil. bunun işe yarayıp yaramadığını kimse doğrulayabilir mi?
Sam Eaton

1
Bu yapılandırma sadece istemci tarafında yapılabilir sanmıyorum .. Nereye koymak için, sunucu tarafı kodu (muhtemelen bir istek için bir yanıt oluştururken) olurdu
Chirag Ravindra

145

Hata neden ortaya çıkıyor:

JavaScript kodu ile sınırlıdır aynı kaynak politikası bir sayfadan, yani www.example.comyalnızca bulunan servislere (AJAX) isteklerini yapabilir aynen aynen, bu durumda, aynı etki www.example.com( değil example.com - olmadan www- ya whatever.example.com).

Sizin durumunuzda, Ajax kodunuz http://wordicious.comadresindeki bir sayfadan bir hizmete ulaşmaya çalışıyor http://www.wordicious.com.

Çok benzer olmalarına rağmen aynı alan adı değillerdir . Ve aynı alan adında olmadıklarında, istek yalnızca hedefin çağrısının içinde bir Access-Control-Allow-Originbaşlık varsa başarılı olur .

Adresindeki sayfanız / hizmetiniz http://wordicious.comhiçbir zaman böyle bir üstbilgi gösterecek şekilde yapılandırılmadığından, bu hata mesajı gösterilir.

Çözüm:

Daha önce de belirtildiği gibi, başlangıç ​​noktası (JavaScript içeren sayfanın bulunduğu yer) ve hedef (JavaScript'in erişmeye çalıştığı yer) alanları tam olarak aynı olmalıdır .

Vakanız bir yazım hatası gibi görünüyor. Görünüşe göre http://wordicious.comve http://www.wordicious.comaslında aynı sunucu / etki alanı. : Yani düzeltme için eşit hedef ve kökenini yazın size Ajax kod isteği sayfaları / hizmetler yapmak http://www.wordicious.comdeğilhttp://wordicious.com . (Hedef URL'yi '/login.php'alan adı olmadan nispeten yerleştirebilirsiniz ).



Daha genel bir not:

Sorun, bu sorudaki gibi bir yazım hatası değilse, çözüm , hedef etki alanına eklemekAccess-Control-Allow-Origin olacaktır . Eklemek, elbette, bu adresin arkasındaki sunucuya / dile bağlıdır. Bazen araçtaki bir yapılandırma değişkeni hile yapar. Diğer durumlarda, başlıkları kod yoluyla kendiniz eklemeniz gerekir.


62

.NET sunucusu bunu web.config içinde aşağıda gösterildiği gibi yapılandırabilir

 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="your_clientside_websiteurl" />
     </customHeaders>
   </httpProtocol>
 </system.webServer>

Örneğin, sunucu etki alanı http://live.makemypublication.com ve istemci http://www.makemypublication.com ise sunucunun web.config dosyasında aşağıdaki gibi yapılandırın

 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="http://www.makemypublication.com" />
     </customHeaders>
  </httpProtocol>
 </system.webServer>

Daha da iyi bir çözüm. Teşekkürler
ANJYR - KODEXPRESSION

Çok teşekkürler. Bütün günümü kurtardın.
Prateek Gupta

2 yıl sonra bile çalışıyor: p
Yerde Geliştiriciler

1
@SyedAliTaqi soru php, bu yüzden cevabın önemsiz. Ancak benim için de çalıştı :)
Ahmad Th

22

Bu hata mesajını tarayıcıdan alırsanız:

İstenen kaynakta 'Access-Control-Allow-Origin' başlığı yok. '…' Kaynağının bu nedenle erişime izin verilmiyor

kontrolünüz dışındaki bir uzak sunucuya Ajax POST / GET isteği yapmaya çalışırken, lütfen bu basit düzeltmeyi unutun:

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

Özellikle Ajax isteğini yapmak için yalnızca JavaScript kullanıyorsanız, yapmanız gereken şey, sorgunuzu alan ve uzak sunucuya gönderen dahili bir proxy'dir.

İlk önce JavaScript'inizde, kendi sunucunuza bir Ajax çağrısı yapın, şunun gibi:

$.ajax({
    url: yourserver.com/controller/proxy.php,
    async:false,
    type: "POST",
    dataType: "json",
    data: data,
    success: function (result) {
        JSON.parse(result);
    },
    error: function (xhr, ajaxOptions, thrownError) {
        console.log(xhr);
    }
});

Ardından, POST verilerinizi sarmak ve bunları uzak URL sunucusuna parametre olarak eklemek için proxy.php adlı basit bir PHP dosyası oluşturun. Size Expedia Hotel arama API'sı ile bu sorunu nasıl atladığımın bir örneğini veriyorum:

if (isset($_POST)) {
  $apiKey = $_POST['apiKey'];
  $cid = $_POST['cid'];
  $minorRev = 99;

  $url = 'http://api.ean.com/ean-services/rs/hotel/v3/list?' . 'cid='. $cid . '&' . 'minorRev=' . $minorRev . '&' . 'apiKey=' . $apiKey;

  echo json_encode(file_get_contents($url));
 }

Yaparak:

 echo json_encode(file_get_contents($url));

Sadece aynı sorguyu yapıyorsunuz ama sunucu tarafında ve bundan sonra iyi çalışıyor.


@NizarBsb deli olduğunu biliyorsun !!!!! : D, çok teşekkürler cevabın hayatımı kurtardı
Flash

10

Bunu php sayfanızın "login.php" başlangıcına eklemeniz gerekir

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

5
Kesinlikle güvenli değil.
geri arama

7

seçenekler yöntemi yanıtına üstbilgi anahtarlarını / değerlerini koymanız gerekir. örneğin http://alanadim.com/alanim adresinde kaynak varsa , sunucu kodunuza

//response handler
void handleRequest(Request request, Response response) {
    if(request.method == "OPTIONS") {
       response.setHeader("Access-Control-Allow-Origin","http://clientDomain.com")
       response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
       response.setHeader("Access-Control-Allow-Headers", "Content-Type");
    }



}

3

Temel olarak aşağıdaki ek parametreler ekleyerek API üstbilgisi yanıtını değiştirin.

Access-Control-Allow-Credentials: doğru

Erişim-Kontrol-İzin Ver-Menşei: *

Ancak güvenlik söz konusu olduğunda bu iyi bir çözüm değildir


3

Çözüm, 'kaynak' ana bilgisayarınızda çalışan ve Fiddler gibi hedef sunucunuza yönlendiren bir ters proxy kullanmaktır:

Buraya bağla: http://docs.telerik.com/fiddler/configure-fiddler/tasks/usefiddlerasreverseproxy

Ya da Apache Ters proxy'si ...


bu, bir etki alanı için Apache veya Nginx yapılandırma düzeyinde yapılabilir. örneğin bir kullanıcı mysite.com sitesine erişiyorsa (www yok) ve XHR www.mysite.com istiyorsa, bir htaccess veya httpd.conf yönergesi bunu çözebilir mi?
codecowboy

Elbette, Ön Uç Uygulamanız ters bir proxy gibi davranmalıdır. Örneğin Apache için mod_proxy'yi yüklemeniz ve ProxyPassReverse ( httpd.apache.org/docs/current/mod/… ) kullanarak kurallarınızı yapılandırmanız gerekir . Aynı özellikler Nginx'te
hzrari

2

Bunu PHP dosyasına veya ana denetleyiciye ekle

header("Access-Control-Allow-Origin: http://localhost:9000");

bitirmek için - ayrıca gerekirheader("Access-Control-Allow-Credentials: true");
Adam

1

Httpd.conf dosyasına aşağıdaki giriş ile çözüldü

#CORS Issue
Header set X-Content-Type-Options "nosniff"
Header always set Access-Control-Max-Age 1728000
Header always set Access-Control-Allow-Origin: "*"
Header always set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT,PATCH"
Header always set Access-Control-Allow-Headers: "DNT,X-CustomHeader,Keep-Alive,Content-Type,Origin,Authentication,Authorization,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control"
Header always set Access-Control-Allow-Credentials true

#CORS REWRITE
RewriteEngine On                  
RewriteCond %{REQUEST_METHOD} OPTIONS 
#RewriteRule ^(.*)$ $1 [R=200,L]
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]]

Apache2, CentOS7, Larravel 5 ve React'te benim için çalışan tek yol
Shakiba Moshiri

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.