Tidak ada header 'Access-Control-Allow-Origin' yang ada di resource yang diminta. Oleh karena itu, asal '…' tidak diizinkan mengakses

135

Saya menggunakan .htaccess untuk menulis ulang url dan saya menggunakan tag dasar html untuk membuatnya berfungsi.

Sekarang, ketika saya mencoba membuat permintaan ajax saya mendapatkan kesalahan berikut:

XMLHttpRequest tidak dapat dimuat http://www.example.com/login.php. Tidak ada header 'Access-Control-Allow-Origin' yang ada di resource yang diminta. Asal ' http://example.com' karena itu tidak diizinkan akses.

Th3lmuu90
sumber
1
Nevermind ... ini berfungsi sekarang, saya bahkan tidak tahu apa kesalahannya: S
Th3lmuu90
8
Altough halus, http://wordicious.comadalah domain yang berbeda dari http://www.wordicious.com/, jadi errornya. Btw, jika berfungsi sekarang dan kembali dengan sendirinya, Anda mungkin harus menghapus pertanyaannya.
acdcjunior
@acdcjunior Sepertinya itu adalah kesalahan, yang merupakan pengamatan cerdik di pihak Anda. Jika Anda memposting itu sebagai jawaban, saya akan memberi suara positif.
Waleed Khan
5
Untunglah pertanyaan itu tidak dihapus, atau saya tidak akan melihatnya hari ini!
es

Jawaban:

170

Gunakan addHeaderDaripada menggunakan setHeadermetode,

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

*di baris atas akan memungkinkan access to all domains.


Untuk mengizinkan access to specific domain only:

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

Periksa ini blog post.

Jay Patel
sumber
4
itu menunjukkan addheader tidak ditentukan. Bisakah Anda menjelaskannya?
Vaisakh Pc
9
Di mana saya meletakkan garis-garis ini?
DaveWalley
14
Dimana ini harus ditambahkan?
Alex
1
Posting blog itu berbicara tentang Node.js dan express. Bukan javascript sisi klien. Adakah yang bisa memastikan apakah ini berhasil?
Sam Eaton
1
Saya rasa konfigurasi ini tidak dapat dilakukan hanya di sisi klien .. Jadi, di mana harus meletakkannya, itu akan berada di kode sisi server (mungkin saat membangun tanggapan atas permintaan)
Chirag Ravindra
146

Mengapa kesalahan dimunculkan:

Kode JavaScript dibatasi oleh kebijakan asal yang sama , artinya, dari laman di www.example.com, Anda hanya dapat membuat permintaan (AJAX) ke layanan yang terletak di domain yang persis sama, dalam hal ini, persis www.example.com( bukan example.com - tanpa www- atau whatever.example.com).

Dalam kasus Anda, kode Ajax Anda mencoba menjangkau layanan http://wordicious.comdari halaman yang terletak di http://www.wordicious.com.

Meski sangat mirip, mereka bukan domain yang sama. Dan jika mereka tidak berada di domain yang sama, permintaan hanya akan berhasil jika tanggapan target berisi Access-Control-Allow-Originheader di dalamnya.

Karena halaman / layanan Anda di http://wordicious.comtidak pernah dikonfigurasi untuk menampilkan header seperti itu, pesan kesalahan itu akan ditampilkan.

Larutan:

Seperti yang dikatakan, domain asal (tempat halaman dengan JavaScript berada) dan domain target (tempat JavaScript mencoba menjangkau) harus sama persis .

Kasus Anda sepertinya salah ketik. Sepertinya http://wordicious.comdan http://www.wordicious.comsebenarnya adalah server / domain yang sama. Jadi untuk memperbaikinya, ketik target dan asal sama-sama: membuat Anda meminta kode Ajax halaman / layanan untuk http://www.wordicious.comtidakhttp://wordicious.com . (Mungkin tempatkan URL target secara relatif, seperti '/login.php', tanpa domain).



Pada catatan yang lebih umum:

Jika masalahnya bukan kesalahan ketik seperti yang tampaknya menjadi salah satu pertanyaan ini, solusinya adalah menambahkan Access-Control-Allow-Originke domain target . Untuk menambahkannya, tentu saja bergantung pada server / bahasa di balik alamat itu. Terkadang variabel konfigurasi di alat akan melakukan triknya. Di lain waktu Anda harus menambahkan sendiri header melalui kode.

acdcjunior.dll
sumber
62

Untuk server .NET dapat mengkonfigurasi ini di web.config seperti gambar di bawah ini

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

Misalnya, jika domain server adalah http://live.makemypublication.com dan klien adalah http://www.makemypublication.com maka konfigurasikan di web.config server seperti di bawah ini

 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="http://www.makemypublication.com" />
     </customHeaders>
  </httpProtocol>
 </system.webServer>
Naga
sumber
Solusi yang lebih baik. Terima kasih
ANJYR
Terima kasih banyak. Anda menyelamatkan seluruh hari saya.
Prateek Gupta
Bekerja bahkan setelah 2 tahun: p
Ubiquitous Developers
1
@SyedAliTaqi pertanyaannya php, makanya jawabannya diremehkan. namun itu berhasil untuk saya juga :)
Ahmad Th
22

Jika Anda mendapatkan pesan kesalahan ini dari browser:

Tidak ada header 'Access-Control-Allow-Origin' yang ada di resource yang diminta. Oleh karena itu, asal '…' tidak diizinkan mengakses

ketika Anda mencoba melakukan permintaan Ajax POST / GET ke server jarak jauh yang di luar kendali Anda, lupakan tentang perbaikan sederhana ini:

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

Apa yang benar-benar perlu Anda lakukan, terutama jika Anda hanya menggunakan JavaScript untuk melakukan permintaan Ajax, adalah proxy internal yang mengambil kueri Anda dan mengirimkannya ke server jauh.

Pertama di JavaScript Anda, lakukan panggilan Ajax ke server Anda sendiri, seperti:

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

Kemudian, buat file PHP sederhana bernama proxy.php untuk membungkus data POST Anda dan menambahkannya ke server URL jarak jauh sebagai parameter. Saya memberi Anda contoh bagaimana saya melewati masalah ini dengan API pencarian Hotel Expedia:

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

Dengan melakukan:

 echo json_encode(file_get_contents($url));

Anda hanya melakukan kueri yang sama tetapi di sisi server dan setelah itu, seharusnya berfungsi dengan baik.

Nizar B.
sumber
@NizarBsb kamu gila kamu tahu itu !!!!! : D, terima kasih banyak jawaban Anda menyelamatkan hidup saya
Flash
10

Anda perlu menambahkan ini di awal halaman php Anda "login.php"

<?php header('Access-Control-Allow-Origin: *'); ?>
Mohamed Sherif yang teduh
sumber
5
Jelas tidak aman.
panggilan balik
7

Anda harus meletakkan kunci / nilai header dalam respon metode opsi. misalnya jika Anda memiliki sumber daya di http://mydomain.com/myresource lalu, di kode server Anda tulis

//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");
    }



}
i-systech.com
sumber
3

Pada dasarnya, ubah respons header API dengan menambahkan parameter tambahan berikut.

Access-Control-Allow-Credentials: benar

Access-Control-Allow-Origin: *

Tapi ini bukan solusi yang baik dalam hal keamanan

Piusha
sumber
3

Solusinya adalah dengan menggunakan proxy terbalik yang berjalan di host 'sumber' Anda dan meneruskan ke server target Anda, seperti Fiddler:

Tautkan di sini: http://docs.telerik.com/fiddler/configure-fiddler/tasks/usefiddlerasreverseproxy

Atau proxy Apache Reverse ...

hzrari
sumber
dapatkah ini dilakukan pada tingkat konfigurasi Apache atau Nginx untuk domain. misalnya jika pengguna mengakses mysite.com (tanpa www) dan XHR meminta www.mysite.com, dapatkah direktif htaccess atau httpd.conf menyelesaikannya?
codecowboy
Tentu, Aplikasi Front-End Anda harus berfungsi sebagai proxy terbalik. misalnya untuk Apache, Anda harus menginstal mod_proxy, dan mengkonfigurasi aturan Anda menggunakan ProxyPassReverse ( httpd.apache.org/docs/current/mod/… ). Fitur yang sama tampaknya juga tersedia di Nginx: wiki.nginx.org/LikeApache
hzrari
2

Tambahkan ini ke Anda file PHP atau pengontrol utama

header("Access-Control-Allow-Origin: http://localhost:9000");
Sam
sumber
untuk menyelesaikan - Anda juga perluheader("Access-Control-Allow-Credentials: true");
Adam
1

Diselesaikan dengan entri di bawah ini di httpd.conf

#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}]]
Sandeep540
sumber
Satu-satunya cara yang berhasil bagi saya di Apache2, CentOS7, Larravel 5, dan React
Shakiba Moshiri