Origin non è consentito da Access-Control-Allow-Origin


337

Sto realizzando un Ajax.requestserver PHP remoto in un'applicazione Sencha Touch 2 ( inclusa in PhoneGap ).

La risposta dal server è la seguente:

XMLHttpRequest non può caricare http://nqatalog.negroesquisso.pt/login.php . Origin http://localhost:8888non è consentito da Access-Control-Allow-Origin.

Come posso risolvere questo problema?


19
durante l'utilizzo di jQuery, impostazione dataType: 'jsonp',fa il trucco
Amit

11
a proposito che non è la risposta dal server. Per essere precisi, l'errore viene emesso sul lato client.
matteo,

2
Il trucco jsonp probabilmente non funziona più, FYI: stackoverflow.com/questions/12216208/...
drewww

7
Nota, poiché ho appena perso mezza giornata a inseguire questo bug - Se lo script sul lato server non riesce con un errore interno del server, il browser potrebbe interpretarlo come se la richiesta non fosse consentita a causa Access-Control-Allow-Origine segnalarlo come errore.
troelskn,

1
@troelskn Mi hai appena salvato la vita. Stavo cercando qualche errore CORS da 3 giorni, ed era semplicemente un piccolo problema di configurazione di Spring che causava un 500, che ho risolto in 5 minuti dopo aver letto il tuo commento e in realtà l'ho cercato. Grazie!
Alexis Dufrenoy,

Risposte:


378

Ho scritto un articolo su questo problema qualche tempo fa, Cross Domain AJAX .

Il modo più semplice per gestirlo se si ha il controllo del server di risposta è aggiungere un'intestazione di risposta per:

Access-Control-Allow-Origin: *

Ciò consentirà Ajax tra domini . In PHP, ti consigliamo di modificare la risposta in questo modo:

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

Puoi semplicemente mettere l' Header set Access-Control-Allow-Origin *impostazione nella configurazione di Apache o nel file htaccess.

Va notato che questo disabilita efficacemente la protezione CORS, che molto probabilmente espone gli utenti all'attacco . Se non sai che devi specificamente utilizzare un carattere jolly, non dovresti usarlo e invece dovresti inserire nella whitelist il tuo dominio specifico:

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

4
Contatterò il mio provider di server. Grazie
Ricardo,

8
Ci sono problemi di sicurezza con questo? Questa risposta , ad esempio, afferma che "JavaScript è limitato dalla" stessa politica di origine "per motivi di sicurezza. Ad esempio, uno script dannoso non può contattare un server remoto e inviare dati riservati dal tuo sito."
JohnK,

4
Fantastico, l'ho appena inserito nel mio file server node.js: response.writeHead (200, {'Content-Type': contentType, 'Access-Control-Allow-Origin': '*'}); E ha funzionato. Grazie!
Vbullinger,

25
JohnK, sì, il carattere jolly consentirà a qualsiasi dominio di inviare richieste al tuo host. Ti consiglio di sostituire l'asterisco con un dominio specifico sul quale eseguirai gli script.
Nick,

7
È interessante pensare che il jolly non debba nemmeno essere suggerito @jfrej. Tutto dipende dal tuo obiettivo. Ad esempio, il motivo per cui abbiamo utilizzato il carattere jolly (e pubblicato questa risposta) è stato perché stavamo costruendo un widget incorporato per qualsiasi sito da utilizzare.
Matt Mombrea,

63

Se non si ha il controllo del server, si può semplicemente aggiungere questo argomento per il vostro programma di avvio Chrome: --disable-web-security.

Nota che non lo userei per la normale "navigazione sul web". Per riferimento, vedi questo post: disabilita la stessa politica di origine in Chrome .

Uno che usi Phonegap per creare effettivamente l'applicazione e caricarla sul dispositivo, non sarà un problema.


Grazie. Ma la mia app è in esecuzione su dispositivi mobili, non posso trasmettere argomenti al mio wrapper di visualizzazione web.
Ricardo,

Non testare prima l'app in un browser? Come esegui il debug?
Travis Webb,

Sì, eseguo il debug in un browser Chrome, ma l'app non funzionerà su Chrome. Sarà su phonegap webview che non posso controllare.
Ricardo,

4
leggi la risposta: puoi semplicemente aggiungere questo argomento al tuo launcher di Chrome . Non ci sono impostazioni per questo all'interno di Chrome
Travis Webb del

2
Certo che è insicuro. L'OP chiede un modo per aggirare le misure di sicurezza.
Travis Webb,

42

Se stai usando Apache basta aggiungere:

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

nella tua configurazione. Ciò farà sì che tutte le risposte del tuo server web siano accessibili da qualsiasi altro sito su Internet. Se si intende consentire l'utilizzo dei servizi sul proprio host da parte di un server specifico, è possibile sostituirlo *con l'URL del server di origine:

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

3
E non dimenticare di caricare il modulo: intestazioni a2enmod
Walery Strauch,

come caricare il modulo: intestazioni a2enmod?
Ayesha,

18

Se si dispone di un'applicazione ASP.NET / ASP.NET MVC , è possibile includere questa intestazione tramite il file Web.config:

<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 People, GUARDA qui! In realtà scriverò una soluzione e indicherò questa risposta sul mio blog in modo che le persone possano trovarla più facilmente. Niente di peggio che cercare di superare un ostacolo .NET / MVC e trovare nient'altro che soluzioni PHP / jQuery. Grazie @ Caio-Proiete
ottoflux il

1
Come mai questo non funziona per me? Sto usando Chrome e sto provando ad accedere alla pagina di finanziamento di Yahoo dal mio localhost.
Newman,

1
grazie ha funzionato per me. Ho aggiunto il progetto del codice lato server (web.config).
ethem

15

Questa è stata la prima domanda / risposta che è emersa per me quando ho cercato di risolvere lo stesso problema utilizzando ASP.NET MVC come fonte dei miei dati. Mi rendo conto che questo non risolve la domanda PHP , ma è abbastanza correlato per essere prezioso.

Sto usando ASP.NET MVC. Il post sul blog di Greg Brant ha funzionato per me. Alla fine, crei un attributo [HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]che puoi aggiungere alle azioni del controller.

Per esempio:

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

E poi usandolo con:

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

1
WebApi 2 ha questo integrato ora. asp.net/web-api/overview/security/…
Matt Frear,

10

Poiché Matt Mombrea è corretto per il lato server, potresti riscontrare un altro problema che è il rifiuto della whitelisting.

Devi configurare il tuo phonegap.plist. (Sto usando una vecchia versione di phonegap)

Per cordova, potrebbero esserci delle modifiche nella denominazione e nella directory. Ma i passaggi dovrebbero essere per lo più gli stessi.

Prima seleziona File di supporto> PhoneGap.plist

inserisci qui la descrizione dell'immagine

quindi in "ExternalHosts"

Aggiungi una voce, con un valore forse " http://nqatalog.negroesquisso.pt " Sto usando * solo a scopo di debug.

inserisci qui la descrizione dell'immagine


8

Questo potrebbe essere utile per chiunque abbia bisogno di un'eccezione per entrambe le versioni "www" e "non www" di un referrer:

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

Mi ha indicato la giusta direzione nella risoluzione dell'errore ACAO con l'azzurro. Mentre avevo aggiunto il nome host consentito di googledrive. L'URL utilizzato deve essere googledrive NON googledrive
Kildareflare

7

Ti darò una soluzione semplice per questo. Nel mio caso non ho accesso a un server. In tal caso è possibile modificare la politica di sicurezza nel browser Google Chrome per consentire Access-Control-Allow-Origin. Questo è molto semplice:

  1. Crea un collegamento al browser Chrome
  2. Icona scorciatoia tasto destro del mouse -> Proprietà -> Collegamento -> Destinazione

Incolla semplice "C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-security.

La posizione potrebbe essere diversa. Ora apri Chrome facendo clic su quel collegamento.


7

Mi sono imbattuto in questo alcune volte quando lavoro con varie API. Spesso una soluzione rapida è aggiungere "& callback =?" alla fine di una stringa. A volte la e commerciale deve essere un codice carattere, a volte un "?": "? Callback =?" (vedi Utilizzo dell'API Forecast.io con jQuery )


6

Se si scrive un'estensione Chrome e ottenere questo errore, quindi assicuratevi di aver aggiunto URL di base della API per la tua manifest.jsons' le autorizzazioni di blocco , ad esempio:

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


6

se sei sotto apache, aggiungi un file .htaccess alla tua directory con questo contenuto:

Header set Access-Control-Allow-Origin: *

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

Header set Access-Control-Allow-Methods: *

5

In Ruby on Rails , puoi fare in un controller:

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

in quale controller lo metti se è una chiamata Ajax? Posso vedere più contesto di codice?
rigdonmr,

5

Puoi farlo funzionare senza modificare il server facendo in modo che il broswer includa l'intestazione Access-Control-Allow-Origin: *nelle risposte delle OPZIONI HTTP.

In Chrome, usa questa estensione . Se sei su Mozilla, controlla questa risposta .


5

Se lo ottieni in Angular.js, assicurati di sfuggire al tuo numero di porta in questo modo:

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

Vedi qui per maggiori informazioni.


4

Abbiamo anche lo stesso problema con l'applicazione phonegap testata in Chrome. Un computer Windows che utilizziamo sotto il file batch ogni giorno prima di aprire Chrome. Ricorda che prima di eseguire questa operazione devi pulire tutte le istanze di Chrome dal Task Manager oppure puoi selezionare Chrome per non eseguire in background.

LOTTO: (usa cmd)

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

1

In Ruby Sinatra

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

per tutti o

response['Access-Control-Allow-Origin'] = 'http://yourdomain.name' 

0

Quando ricevi la richiesta puoi

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

rispetto a quando devi rispondere vai con qualcosa del genere:

res.writeHead(
    206,
    {
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Allow-Origin': origin,
    }
);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.