Header-Set Access-Control-Allow-Origin in .htaccess funktioniert nicht

90

Ich kann nicht herausfinden, warum meine .htaccessHeader-Einstellungen nicht funktionieren.

Mein .htaccessDateiinhalt:

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]

Aber wenn ich sie entferne Headerund hinzufüge, index.phpfunktioniert alles einwandfrei.

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

Was vermisse ich?

user1401592
quelle

Antworten:

134

Das sollte funktionieren:

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"
imbrizi
quelle
46
Vergessen Sie nicht, die Apache-Modul-Header zu aktivierena2enmod headers
Lucas Serafim
1
Es wurde behoben: "Method PUT ist von Access-Control-Allow-Methods nicht erlaubt"
Rahul Prasad
6
Auch Header setin diesem Fall ist es am besten zu verwenden . Wenn der Code geändert wird und der Header gesetzt header addwird, sendet Apache doppelte ** Header. Dadurch werden Clients wie beispielsweise Restangular beschädigt.
Julian
2
Vergessen Sie nicht, wenn nötigHeader add Access-Control-Allow-Credentials "true"
Marco Marsala
20

Nur zur Veranschaulichung, ich hatte genau das gleiche Problem und keine der Antworten funktionierte.

Ich habe ein Tool zur Überprüfung von Headern verwendet: http://www.webconfs.com/http-header-check.php

Ich habe mit meiner IP ( http://192.0.2.1/upload) getestet und es kam Folgendes zurück:

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

Es wurde eine Umleitung durchgeführt, und die AJAX-Anforderung berücksichtigt keine Weiterleitungen.

Es stellte sich heraus, dass der Schrägstrich am Ende der Domain fehlte ( http://192.0.2.1/upload / ).

Ich habe am Ende erneut mit einem Schrägstrich getestet und dies unten erhalten. Es wurde auch ein Schrägstrich im Skript hinzugefügt, und es funktionierte jetzt.

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

Verwenden Sie dieses Tool, um zu testen, ob Ihre Header gut sind, und um Fehler zu beheben.

Miro
quelle
4
Ich habe gerade 11 Registerkarten geöffnet, um dies zu lösen. Diese Antwort sollte an mehreren Stellen sein.
JDavis
Bei meinem musste ich den nachgestellten Schrägstrich entfernen. Ich bin so froh, dass ich das gefunden habe. Ich habe so viel Zeit damit verbracht, Fehler zu beheben, als ich neu war, dass es vor Stunden hätte funktionieren sollen.
Gorelog
11

Ich habe ein gemeinsames Hosting auf GoDaddy. Ich brauchte auch eine Antwort auf diese Frage, und nachdem ich mich umgesehen hatte, stellte ich fest, dass es möglich ist.

Ich habe eine .htaccess-Datei geschrieben und sie im selben Ordner wie meine Aktionsseite abgelegt. Hier ist der Inhalt der .htaccess-Datei:

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"

Hier ist mein Ajax-Anruf:

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

Siehe diesen Artikel als Referenz:

Header-Set Access-Control-Allow-Origin in .htaccess funktioniert nicht

TARKUS
quelle
8

Seien Sie vorsichtig bei:

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

Dies ist überhaupt nicht sinnvoll, um jedem Zugang zu gewähren. Es ist vorzuziehen, nur eine Liste von bekannten vertrauenswürdigen Hosts zuzulassen ...

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"

Grüße,

Alex
quelle
2
Das wird nicht funktionieren. Access-Control-Allow-Origin darf nicht mehrere Werte enthalten. Sie müssen den Header dynamisch basierend auf dem Wert des Origin-Anforderungsheaders festlegen.
Quentin
7

Ich habe die Apache-Modul-Header a2enmod-Header aktiviert und das Problem wurde behoben.

trueblue82
quelle
Fehler im Protokoll waren nicht klar, warum die von mir vorgenommenen Änderungen fehlschlagen würden, und diese Antwort half sehr. sudo a2enmod headersund ein Neustart brachte es zum Laufen!
Cchana
3

Versuchen Sie dies im .htaccess des externen Stammordners

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

Seien Sie vorsichtig bei: Header add Access-Control-Allow-Origin "*" Dies ist überhaupt nicht sinnvoll, um allen Zugriff zu gewähren. Ich denke, Sie sollten Benutzer:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://example.com"
</IfModule>
Vo Quoc Cuong
quelle
3

Ich habe Miros Antwort auf den Link zur Header-Checker-Site http://www.webconfs.com/http-header-check.php gegeben . Bei jeder Verwendung wird eine unangenehme Anzeige angezeigt. Sie ist jedoch sehr nützlich, um das Vorhandensein des Headers "Access-Control-Allow-Origin" zu überprüfen.

Ich lese eine .json-Datei aus dem Javascript auf meiner Webseite. Ich habe festgestellt, dass das Hinzufügen des Folgenden zu meiner .htaccess-Datei das Problem beim Anzeigen meiner Webseite in IE 11 (Version 11.447.14393.0) behoben hat:

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

Ich habe außerdem Folgendes zu /etc/httpd.conf (Apaches Konfigurationsdatei) hinzugefügt:

AllowOverride All

Die Header-Checker-Site hat überprüft, ob der Access-Control-Allow-Origin-Header jetzt gesendet wird (danke, Miro!).

Firefox 50.0.2, Opera 41.0.2353.69 und Edge 38.14393.0.0 rufen die Datei jedoch trotzdem ab, auch ohne den Header Access-Control-Allow-Origin. (Hinweis: Möglicherweise werden IP-Adressen überprüft, da die beiden von mir verwendeten Domänen beide auf demselben Server und derselben IPv4-Adresse gehostet werden.)

Chrome 54.0.2840.99 m (64-Bit) ignoriert jedoch den Header "Access-Control-Allow-Origin" und schlägt trotzdem fehl, indem fälschlicherweise Folgendes gemeldet wird:

In der angeforderten Ressource ist kein Header 'Access-Control-Allow-Origin' vorhanden. Origin ' {mydomain} ' ist daher kein Zugriff gestattet.

Ich denke, das muss eine Art "Erste" sein. IE funktioniert richtig; Chrome, Firefox, Opera und Edge sind alle fehlerhaft. und Chrome ist das Schlimmste . Ist das nicht das genaue Gegenteil des Normalfalls?

Dave Burton
quelle
0

Nach einem halben Tag ohne Arbeit. Verwenden eines Header-Check-Dienstes, obwohl alles funktioniert hat. Die Firewall bei der Arbeit entfernte sie

Matt in Washington
quelle
0

Versuche dies:

<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>

Es ist vorzuziehen, eine Liste bekannter vertrauenswürdiger Hosts zuzulassen.

Behnam Shateri
quelle
0

Wenn jemand anderes dies versucht, sollte die am besten bewertete Antwort funktionieren. Wenn Sie jedoch Probleme haben, hat der Browser möglicherweise die ANFRAGE zwischengespeichert. Zum Bestätigen eine Abfragezeichenfolge anhängen.

Simon Song
quelle