İstek üstbilgisi alanı Access-Control-Allow-Headers'a Access-Control-Allow-Headers tarafından izin verilmiyor


224

Sunucuma bir gönderme isteği ile dosya göndermeye çalışıyorum, ancak gönderdiğinde hataya neden oluyor:

İstek üstbilgisi alanına Content-Type, Access-Control-Allow-Headers tarafından izin verilmiyor.

Bu yüzden hatayı googled ve başlıkları ekledim:

$http.post($rootScope.URL, {params: arguments}, {headers: {
    "Access-Control-Allow-Origin" : "*",
    "Access-Control-Allow-Methods" : "GET,POST,PUT,DELETE,OPTIONS",
    "Access-Control-Allow-Headers": "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
}

Sonra hatayı alıyorum:

İstek üstbilgisi alanı Access-Control-Allow-Origin'e Access-Control-Allow-Headers tarafından izin verilmiyor

Bu yüzden googled ve bulabildiğim tek benzer soru yarım cevap verildi sonra kapalı konu olarak. Hangi başlıkları eklemem / kaldırmam gerekiyor?


Bu başlıklar sunucudan tarayıcıya gönderilir, böylece tarayıcı JS'nin yanıtı ayrıştırmasına izin verilip verilmediğine karar verebilir. Onları isteğe eklemenin değeri yoktur.
pellyadolfo

Yanıtlar:


189

Sunucu (POST talebi gönderilmesi) içermesi gerekir Access-Control-Allow-Headersbaşlığı (vs) cevabında . Bunları istemciden isteğinize eklemenin bir etkisi yoktur.

Bunun nedeni, çapraz kaynak isteklerini kabul ettiğini (ve Content-Typeistek üstbilgisine izin verdiğini vb.) Belirtmek sunucuya bağlıdır - istemci, belirli bir sunucunun CORS'ye izin vermesi gerektiğine kendisi karar veremez.


5
Arka uçtaki üstbilgileri nasıl ayarlarım?
user3194367

11
@ user3194367: Arka ucunuza bağlıdır.
Felix Kling

15
Sanırım sunucu adamımla konuşmam gerekecek.
user3194367

2
response.addHeader ("Erişim-Denetim-İzin Ver-Başlıkları", "anahtarınız");
Mayuresh

2
@Mayuresh yourKey nedir? Content-Type?
zhuguowei

241

Ben de aynı problemi yaşadım. JQuery belgelerinde buldum:

Dışında herhangi bir içerik türünü ayarlayarak etki alanları arası istekleri için application/x-www-form-urlencoded, multipart/form-dataya text/plainbir uçuş öncesi SEÇENEKLER sunucuya talep göndermek için tarayıcı tetikleyecektir.

Bu nedenle, sunucu çapraz kökenli isteğe izin veriyor ancak izin vermese de Access-Control-Allow-Headershatalar atacak. Varsayılan olarak application/json, OPTION isteği göndermeye çalışan açısal içerik türü 'dir . Açısal varsayılan üstbilginin üzerine yazmayı veya Access-Control-Allow-Headerssunucu sonunda izin vermeyi deneyin . İşte açısal bir örnek:

$http.post(url, data, {
    headers : {
        'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
    }
});

28
Bu kabul edilmiş bir cevap olmalı, diğerinden daha bilgilendirici olmalı!
Mike Szyndel

1
Çok parçalı / form verisi istiyorum çünkü bir şeyi yükseltmek istiyorum
Vlado Pandžić

3
or allow Access-Control-Allow-Headers in server endNasıl?
Omar

1
@omar, hangi sunucu platformunu kullandığınıza bağlıdır. java php ise diğer cevaplar üzerinde örnek varsa o zaman headeryanıtın başlığını ayarlamak için bir işlev adı vardır
Fisherman

1
Son olarak, iki günlük araştırmadan sonra. Sana teşekkür edecek hiçbir sözüm yok!
Mekey Salaria

51

Bu kimseye yardımcı olursa, (bu sadece dev amaçlı izin vermeliyiz gibi bir tür fakir olsa bile) burada aynı sorunla karşılaştığım gibi bir Java çözümüdür. [Düzenle] Kötü kartı * kötü bir çözüm olarak kullanmayın localhost, gerçekten yerel olarak çalışan bir şey olması gerekiyorsa kullanın.

public class SimpleCORSFilter implements Filter {

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "my-authorized-proxy-or-domain");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
    chain.doFilter(req, res);
}

public void init(FilterConfig filterConfig) {}

public void destroy() {}

}

Erişim-Kontrol-İstek-Başlıkları için birden fazla yanıtın görüldüğü gibi, farklı ortamlar nedeniyle açıkça farklılıklar vardır. Benim için işe yarayan, istek nesnesine erişim sağlamak ve başlıkların değerlerini dökmek, özellikle "Erişim-Denetim-İstek-Başlıkları" için başlık değerini dökmektir. Ardından, kopyala / response.setHeader ("Access-Control-Allow-Headers", "{buraya yapıştır}"); Ayrıca Java kullanıyorum, ancak ek değerler gerekli ve bu cevapta bahsettiğim bazı ihtiyaç yoktu.
Yazılım Peygamberleri

Bu, insanlara yardım etmek ve ipuçlarını bir yıl önce paylaşmak için kısmi (ve de söylendiği gibi) zayıf bir çözümdü. Aşağı oylama noktasını görmüyorum, ama bu sizin özgürlüğünüz. Fikir, sunucu tarafında başlıklara izin vermektir, böylece SEÇENEK isteği gönderildiğinde, istemci / tarayıcı hangi başlıklara izin verildiğini bilir. Biraz karışıklık olduğunu kabul ediyorum, CORS filtrem o zamandan beri çok değişti. Daha iyi bir uygulama olarak, Access-Control-Allow-Origin asla * olmamalıdır; benim uygulamada, bir özellik tarafından ayarlanır.
lekant

Çözüm en iyi uygulamaları içerecek şekilde düzenlendi
lekant

16

POST isteğinin gönderildiği sunucunun yanıtına Content-Type üstbilgisi eklenmesi gerekir .

Özel bir "X_ACCESS_TOKEN" başlığı dahil olmak üzere dahil edilecek tipik başlıkların bir listesi:

"X-ACCESS_TOKEN", "Access-Control-Allow-Origin", "Authorization", "Origin", "x-requested-with", "Content-Type", "Content-Range", "Content-Disposition", "Content-Description"

Http sunucusu çalışanınızın isteklerinizi gönderdiğiniz web sunucusu için yapılandırması gereken budur.

Ayrıca sunucu adamınızdan "İçerik Uzunluğu" üstbilgisini göstermesini isteyebilirsiniz.

Bunu Kaynaklar Arası Kaynak Paylaşımı (CORS) isteği olarak tanıyacak ve bu sunucu yapılandırmalarını yapmanın sonuçlarını anlamalıdır.

Ayrıntılar için bakınız:


13

PHP'de uygun başlığı şu şekilde etkinleştirebilirsiniz:

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, X-Requested-With");

4
Lütfen cevabınızın diğer cevaplardan ne kadar farklı olduğunu açıklayın. Sadece bazı kodları göndermek çok yararlı değil.
oscfri

1
Sen bir rock yıldızısın, cevapların geri kalanı teknik tarafa bakıyor. Sevgilerim, izin verilmesi gereken yöntemleri de belirterek sorunumu çözdü!
Daniel ZA

1
@DanielZA sadece yout kodunu çalıştırmak istediğiniz gibi "diğer cevaplar teknik tarafa delve" ile ne demek istediğini anlasam da, SO şeylerin neden işe yaramadığını bilmeniz gerektiği gibi şeylerin teknik tarafını araştırmak içindir nasıl çalıştırabilirim. Çözümler hakkında yorum yaparken bu davranışı sarsmayın ...
nicolasassi

8

Düğümler ile aşağıdakiler benim için çalışıyor:

xServer.use(function(req, res, next) {
  res.setHeader("Access-Control-Allow-Origin", 'http://localhost:8080');
  res.setHeader('Access-Control-Allow-Methods', 'POST,GET,OPTIONS,PUT,DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Accept');

  next();
});

-Kontrol-İzin Ver-Yöntemlerinin sırası önemli mi?
vini

@vini, bence önemli değil.
Ninja Kodlama

4

Ayarlamaya çalıştığınız başlıklar yanıt başlıklarıdır. Yanıt olarak, istekte bulunduğunuz sunucu tarafından sağlanmaları gerekir.

İstemcide ayarlanmış yerleri yok. Verilere sahip olan site yerine izin isteyen site tarafından verilebiliyorsa, izin verme imkanına sahip olmak anlamsız olurdu .


Arka uçtaki üstbilgileri nasıl ayarlarım?
user3194367

@ user3194367 - Bu, arka ucunuza bağlıdır. Hangi HTTP sunucusuna veya programlama diline istekte bulunduğunuzu bilmiyorum.
Quentin

Sanırım sunucu adamımla konuşmam gerekecek.
user3194367

3

Herkes bu sorunu ekspres bir sunucu ile yaşıyorsa, aşağıdaki ara katman yazılımını ekleyin

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

3

ionic2 veya angularjs 2 için bazı javascript isteklerini test ediyorsanız, krom veya pc'nizde, çapraz kökene izin vermek için krom tarayıcı için CORS eklentisini yüklediğinizden emin olun.

mayba olsun istekleri gerek kalmadan çalışacaktır, ancak yazı ve koyar ve silmek sorunsuz sorunsuz gitmek için test için cors eklentisi yüklemeniz gerekir, bu definitley serin değil, ama insanların nasıl CORS eklentisi olmadan bunu bilmiyorum.

ve ayrıca json yanıtının bazı json durumlarına göre 400 döndürmediğinden emin olun


3

bu arka uç problemidir. arka uç üzerinde yelken api kullanın cors.js değiştirmek ve buraya dosyalanmış ekleyin

module.exports.cors = {
  allRoutes: true,
  origin: '*',
  credentials: true,
  methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD',
  headers: 'Origin, X-Requested-With, Content-Type, Accept, Engaged-Auth-Token'
};

3

In Asp Net Çekirdek , hızlı kalkınma için çalışan almak için; içinde Startup.cs, Configure methodekle

app.UseCors(options => options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());

2

Benim durumumda, bir web hizmeti yöntemine @HeaderParam gibi birkaç parametre alıyorum.

Bu parametreler CORS filtrenizde şu şekilde beyan EDİLMELİDİR:

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {

        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");
        ...
        headers.add("Access-Control-Allow-Headers", 
        /*
         * name of the @HeaderParam("name") must be declared here (raw String):
         */
        "name", ...);
        headers.add("Access-Control-Allow-Credentials", "true");
        headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");   
    }
}

2

Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-Headershata Access-Control-Allow-Origin, HTTP üstbilgisi alanının yanıt olarak işlenmediği veya buna izin verilmediği anlamına gelir . Access-Control-Allow-OriginAlanı istek üstbilgisinden kaldırın .


2

localhostSorunu çözmek için kullanıyorsanız ve PHP buna ayarlanmışsa:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type'); 

Ön uç kullanımınızdan:

{headers: {"Content-Type": "application/json"}}

ve artık sorun yok localhost!

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.