Il set di intestazioni Access-Control-Allow-Origin in .htaccess non funziona


90

Non riesco a capire perché le mie .htaccessimpostazioni di intestazione non funzionano.

Il mio .htaccesscontenuto del file:

Header set Access-Control-Allow-Origin *
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Allow-Headers "*"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]

Ma quando li rimuovo Headere li aggiungo, index.phptutto funziona bene.

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: *");

Cosa mi manca?

Risposte:


134

Questo dovrebbe funzionare:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

46
Non dimenticare di attivare gli header del modulo apachea2enmod headers
Lucas Serafim

1
Risolto: "Il metodo PUT non è consentito da Access-Control-Allow-Methods"
Rahul Prasad

6
Inoltre, è meglio usare Header setin questo caso. Se il codice è cambiato e si imposta l'intestazione, facendo eseguire ad Apache un header addinvio di intestazioni doppie **. Ciò interromperà client come Restangular, ad esempio.
Julian

2
Non dimenticare, se necessario,Header add Access-Control-Allow-Credentials "true"
Marco Marsala

20

Solo per la cronaca, mi sono imbattuto nello stesso identico problema e nessuna delle risposte ha funzionato.

Ho usato uno strumento di verifica delle intestazioni: http://www.webconfs.com/http-header-check.php

Stavo testando con il mio IP ( http://192.0.2.1/upload) e il risultato è stato il seguente:

HTTP/1.1 301 Moved Permanently => 
Date => Sat, 10 Jan 2015 04:03:35 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
Location => http://192.0.2.1/upload/
Content-Length => 380
Connection => close
Content-Type => text/html; charset=iso-8859-1

Si è verificato un reindirizzamento e la richiesta AJAX non rispetta / segue i reindirizzamenti.

Si è scoperto essere la barra mancante alla fine del dominio ( http://192.0.2.1/upload / )

Ho provato di nuovo con lo slash alla fine e ho ottenuto questo sotto. Aggiunta anche una barra nello script e ora funzionava.

HTTP/1.1 200 OK => 
Date => Sat, 10 Jan 2015 04:03:53 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By => PHP/5.3.8
Access-Control-Allow-Origin => *
Access-Control-Allow-Methods => PUT, GET, POST, DELETE, OPTIONS
Access-Control-Allow-Headers => *
Content-Length => 1435
Connection => close
Content-Type => text/html

Usa questo strumento per verificare se le tue intestazioni sono buone e per risolvere i problemi che stanno accadendo.


5
Ho 11 schede aperte in questo momento cercando di risolvere questo problema. Questa risposta dovrebbe essere in più posti.
JDavis

Con il mio, avevo bisogno di rimuovere la barra finale. Sono così felice di aver trovato questo. Ho passato così tanto tempo a risolvere questo problema quando ho dovuto lavorare ore fa.
gorelog

11

Ho un hosting condiviso su GoDaddy. Avevo bisogno di una risposta anche a questa domanda e dopo aver cercato in giro ho scoperto che è possibile.

Ho scritto un file .htaccess, l'ho messo nella stessa cartella della mia pagina delle azioni. Ecco i contenuti del file .htaccess:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

Ecco la mia chiamata ajax:

    $.ajax({
        url: 'http://www.mydomain.com/myactionpagefolder/gbactionpage.php',  //server script to process data
        type: 'POST',
        xhr: function() {  // custom xhr
            myXhr = $.ajaxSettings.xhr();
            if(myXhr.upload){ // check if upload property exists
                myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // for handling the progress of the upload
            }
            return myXhr;
        },
        //Ajax events
        beforeSend: beforeSendHandler,
        success: completeHandler,
        error: errorHandler,
        // Form data
        data: formData,
        //Options to tell JQuery not to process data or worry about content-type
        cache: false,
        contentType: false,
        processData: false
    });

Vedi questo articolo per riferimento:

Il set di intestazioni Access-Control-Allow-Origin in .htaccess non funziona


8

Stai attento a:

 Header add Access-Control-Allow-Origin "*"

Questo non è affatto giudizioso per garantire l'accesso a tutti. È preferibile consentire solo un elenco di host attendibili conosciuti ...

Header add Access-Control-Allow-Origin "http://aaa.example"
Header add Access-Control-Allow-Origin "http://bbb.example"
Header add Access-Control-Allow-Origin "http://ccc.example"

Saluti,


3
Questo non funzionerà. Access-Control-Allow-Origin non è consentito più valori. È necessario impostare dinamicamente l'intestazione in base al valore dell'intestazione della richiesta di origine.
Quentin

7

Ho attivato le intestazioni del modulo Apache a2enmod e il problema è stato risolto.


Gli errori nel registro non erano chiari sul motivo per cui le modifiche che stavo apportando avrebbero avuto esito negativo e questa risposta è stata di grande aiuto. sudo a2enmod headerse un riavvio lo ha fatto funzionare!
cchana

3

Prova questo nel .htaccess della cartella principale esterna

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

Fai attenzione a: Header add Access-Control-Allow-Origin "*" Questo non è affatto giudizioso per garantire l'accesso a tutti. Penso che dovresti usare:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://example.com"
</IfModule>

3

Ho fatto +1 sulla risposta di Miro per il collegamento al sito di controllo delle intestazioni http://www.webconfs.com/http-header-check.php . Ogni volta che lo usi, fa apparire un annuncio fastidioso, ma è comunque molto utile per verificare la presenza dell'intestazione Access-Control-Allow-Origin.

Sto leggendo un file .json da javascript sulla mia pagina web. Ho scoperto che l'aggiunta di quanto segue al mio file .htaccess ha risolto il problema durante la visualizzazione della mia pagina Web in IE 11 (versione 11.447.14393.0):

<FilesMatch "\.(json)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

Ho anche aggiunto quanto segue a /etc/httpd.conf (file di configurazione di Apache):

AllowOverride All

Il sito di controllo dell'intestazione ha verificato che l'intestazione Access-Control-Allow-Origin viene ora inviata (grazie, Miro!).

Tuttavia, Firefox 50.0.2, Opera 41.0.2353.69 e Edge 38.14393.0.0 recuperano comunque il file, anche senza l'intestazione Access-Control-Allow-Origin. (Nota: potrebbero controllare gli indirizzi IP, poiché i due domini che stavo utilizzando sono entrambi ospitati sullo stesso server, allo stesso indirizzo IPv4.)

Tuttavia, Chrome 54.0.2840.99 m (64 bit) ignora l'intestazione Access-Control-Allow-Origin e non riesce comunque, segnalando erroneamente:

Nessuna intestazione "Access-Control-Allow-Origin" è presente sulla risorsa richiesta. L'accesso all'origine " {miodominio} " non è pertanto consentito.

Penso che questo debba essere una sorta di "primo". IE funziona correttamente; Chrome, Firefox, Opera ed Edge sono tutti difettosi; e Chrome è il peggiore . Non è l'esatto opposto del solito caso?


0

Dopo aver passato mezza giornata senza nulla che funzionasse. Utilizzo di un servizio di controllo dell'intestazione anche se tutto funzionava. Il firewall al lavoro li stava eliminando


0

prova questo:

<IfModule mod_headers.c>
     Header set Access-Control-Allow-Credentials true
     Header set Access-Control-Allow-Origin "your domain"
     Header set Access-Control-Allow-Headers "X-Requested-With"
</IfModule>

È preferibile consentire un elenco di host attendibili conosciuti.


0

Se qualcun altro lo sta provando, la risposta più votata dovrebbe funzionare. Tuttavia, se si verificano problemi, è possibile che il browser abbia memorizzato nella cache la RICHIESTA. Per confermare aggiungere una stringa di query.

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.