Http: // localhost kökeni olduğunda ölümcül CORS


186

Sunucuyu (nginx / node.js) uygun üstbilgilerle ayarlasam da bu CORS sorunuyla sıkışıp kaldım.

Chrome Ağ bölmesinde görebiliyorum -> Yanıt Başlıkları:

Access-Control-Allow-Origin:http://localhost

hile yapmalı.

İşte şimdi test etmek için kullandığım kod:

var xhr = new XMLHttpRequest();
xhr.onload = function() {
   console.log('xhr loaded');
};
xhr.open('GET', 'http://stackoverflow.com/');
xhr.send();

alırım

XMLHttpRequest http://stackoverflow.com/ dosyasını yükleyemiyor . Kökeni http: // localhost Erişim-Control-Allow-Origin tarafından izin verilmez.

Sunucu komut dosyasında değil, istemci komut dosyasında bir sorun olduğundan şüpheleniyorum ...


44
Hayır, stackoverflow.com'un bu başlığı ayarlaması gerekir, siz değil. : x. Aksi takdirde aynı menşe politikasının anlamı ne olurdu.
Esailija

3
Yığın taşmasını değil, ayarladığınız sunucuya erişmeyi deneyin. ;)
Nek

DOH! Köküm localhost olduğunda üstbilgi eksik olsa bile chrome'a ​​(veya başka bir tarayıcıya) söylemenin, kaynağı almanın bir yolu var mı?
whadar

Kodlarınızı Chrome'da çalıştırın (20.0.1132.57, Windows 7), iyi çalışıyor.
imwilsonxu

1
Bir bağlantı noktası ile localhost kullanıyorsanız bu cevap benim için çalıştı serverfault.com/a/673551/238261 .
Nelu

Yanıtlar:


230

Chrome , CORS istekleri için localhost'u desteklemez (2010'da açılan, 2014'te WontFix olarak işaretlenmiş bir hata).

Bu lvh.mesorunu çözmek için, (localhost gibi 127.0.0.1'i işaret eden) bir alan adı kullanabilir veya --disable-web-securitybayrakla krom başlatabilirsiniz (yalnızca test ettiğiniz varsayılarak).


24
@greensuisse - localhost'a mesaj göndermiyor. Yayınlıyor gelen sorun olduğunu localhost.
Cheeso

9
Bu hata geçersiz (ve böyle işaretlendi - crbug.com/67743#c17 ). Esailija'nın yorumu doğrudur, bu başlıkları localhost'a eklemek sihirli bir şekilde diğer tüm sitelere erişmenizi sağlamaz. Bu başlıklarla sunulması gereken uzak sitedir.
Rob W

22
Firefox'ta mükemmel bir şekilde çalıştığını anlamak için Chrome'da 2 saat test Grrrr...
FloatingRock

11
. Diğer seçenek: bilgisayarlarınızın 127.0.0.1 yerel [mysite] .com puan, ardından CORS dosyasını yapmak, böylece dosya düzenleme * izin [mysite] .com.
tom

6
FireFox ile aynı problemle karşılaştım. Sadece Edge'de yapabilirim! Güzel yazı olsa da, harika! :)
Luis Gouveia

54

@ Beau'nun cevabına göre Chrome, localhost CORS isteklerini desteklemez ve bu yönde olası bir değişiklik yoktur.

Bu soruna geçici bir çözüm bulmak için Allow-Control-Allow-Origin: * Chrome Uzantısı'nı kullanıyorum. Uzantı, CORS için gerekli HTTP Üstbilgilerini ekleyecektir:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: "GET, PUT, POST, DELETE, HEAD, OPTIONS"
Access-Control-Expose-Headers: <you can add values here>

Kaynak kodu Github yayınlanmaktadır .

Uzantının varsayılan olarak tüm URL'leri filtrelediğini unutmayın. Bu, bazı web sitelerini bozabilir (örneğin: Dropbox). Yalnızca şu URL filtresine sahip localhost URL'lerini filtrelemek için değiştirdim

*://localhost:*/*

14
@Beau bağlantılarının sorununu okuduysanız, Chrome% 100'ün localhost'a ve localhost'tan çapraz kökenli istekleri desteklediğini göreceksiniz. Sorun 2014 yılında kapatılamadı çünkü çoğaltılamadı. Bu iş parçacığındaki gürültünün geri kalanı, yanlış yapılandırılmış özgün olmayan sunuculara sahip kişilerdir (buradaki orijinal soruda olduğu gibi).
Molomby

1
Krom benim için cazibe gibi çalıştı
Aakash Sahai


3
Bu Uzantı, her ikisine de Access-Control-Allow-Credentials: trueayarlanmış ve bunlara sahip olduğu ve tarayıcılar tarafından engellendiği Access-Control-Allow-Originiçin çalışmıyor . Kimlik bilgilerini true kullanıyorsanız, joker karakter olmayan bir kaynak kullanmalısınız. Üstbilgileri istediğiniz gibi değiştirmenize izin veren Moesif Origins ve CORS Changer Uzantısını öneriyorum. *true*
Samuel

Belki yanlış bir şey yapıyorum, ama bu uzantı artık benim için çalışmıyor gibi görünüyor.
James Parker

19

Asıl sorun, -Allow-tüm istek ( OPTIONS& POST) için ayarlarsak Chrome'un isteği iptal etmesidir. Aşağıdaki kod POST, Chrome ile LocalHost için benim için çalışıyor

<?php
if (isset($_SERVER['HTTP_ORIGIN'])) {
    //header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header("Access-Control-Allow-Origin: *");
    header('Access-Control-Allow-Credentials: true');    
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 
}   
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers:{$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    exit(0);
} 
?>

15
OP nginx / node.js kullanıyor. PHP değil
code_monk

4

Chrome, CORS ile bir localhostkaynaktan gelen istekleri gayet iyi yapacak . Bu Chrome ile ilgili bir sorun değil.

Yükleyememenizin nedeni http://stackoverflow.com, Access-Control-Allow-Originbaşlıkların localhostkökeninize izin vermemesidir .


2

Hızlı ve kirli Chrome uzantı düzeltmesi:

Moesif Orign & CORS Değiştirici

Ancak Chrome, yerel ana bilgisayardan gelen çapraz kökenli istekleri desteklemez. İçin bir başlık eklemek için emin olun Access-Control-Allow-Originiçin localhost.


Ben bu uzantı benim Opera ekledi ve şimdi onun f'd kadar. i açık ve kapalı zaman asla söyleyemem bu yüzden iş için firefox kullanın. ve geliştirme için opera. google kıyafeti beğenmez ve diğer şeyler de sevmez.
Maddocks

1

Uzantıların hiçbiri benim için çalışmadı, bu yüzden basit bir yerel proxy yükledim. Benim durumumda https://www.npmjs.com/package/local-cors-proxy 2 dakikalık bir kurulum:

(sitelerinden)

npm install -g local-cors-proxy

CORS sorunları olan istemek istediğimiz API uç noktası: https://www.yourdomain.ie/movies/list

Proxy'yi başlat: lcp --proxyUrl https://www.yourdomain.ie

Ardından müşteri kodunuzda yeni API uç noktası: http://localhost:8010/proxy/movies/list

Benim için bir cazibe gibi çalıştı: Uygulamanız sunucuyu arayan proxy'yi çağırır. Sıfır CORS problemleri.


0

Başlıklar dokunmamaya ve sunucu tarafında bir yönlendirme yapmamaya karar verdim ve bir cazibe gibi woks.

Aşağıdaki örnek Angular'ın (şu anda 9) geçerli sürümü ve muhtemelen DevServer web paketlerini kullanan diğer herhangi bir çerçeve içindir. Ancak aynı ilkenin diğer arka uçlarda da işe yarayacağını düşünüyorum.

Bu yüzden proxy.conf.json dosyasında aşağıdaki yapılandırmayı kullanıyorum :

{
  "/api": {
    "target": "http://localhost:3000",
    "pathRewrite": {"^/api" : ""},
   "secure": false
 }
}

Açısal olması durumunda bu konfigürasyonla hizmet veririm:

$ ng serve -o --proxy-config=proxy.conf.json

Sunum komutunda proxy kullanmayı tercih ederim, ancak bu yapılandırmayı aşağıdaki gibi angular.json öğesine de koyabilirsiniz :

"architect": {
  "serve": {
    "builder": "@angular-devkit/build-angular:dev-server",
    "options": {
      "browserTarget": "your-application-name:build",
      "proxyConfig": "src/proxy.conf.json"
    },

Ayrıca bakınız:

https://www.techiediaries.com/fix-cors-with-angular-cli-proxy-configuration/

https://webpack.js.org/configuration/dev-server/#devserverproxy

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.