htaccess Access-Control-Allow-Origin

133

Ich erstelle ein Skript, das extern auf anderen Websites geladen wird. Es lädt CSS und HTML und funktioniert gut auf meinen eigenen Servern.

Wenn ich es jedoch auf einer anderen Website versuche, wird der schreckliche Fehler angezeigt:

Access-Control-Allow-Origin

Hier können Sie sehen, dass es perfekt geladen wird : http://tzook.info/bot/

Auf dieser anderen Website wird jedoch der Fehler angezeigt : http://cantloseweight.co/robot/

Ich habe das Ladeskript auf jsfiddle hochgeladen: http://jsfiddle.net/TL5LK/

Ich habe versucht, die htaccess-Datei folgendermaßen zu bearbeiten:

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

Oder so:

Header set Access-Control-Allow-Origin *

Aber es funktioniert immer noch nicht.

Tzook Bar Noy
quelle

Antworten:

267

Versuchen Sie dies im .htaccess des externen Stammordners:

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

Und wenn es sich nur um .js-Skripte handelt, sollten Sie den obigen Code wie folgt einschließen:

<FilesMatch "\.(js)$">
...
</FilesMatch>
vifargent
quelle
6
Toller Rat zur Verwendung FilesMatch.
Nate
1
Wenn wir Dateien durch Hinzufügen des Dateimatch-Blocks abgleichen, was macht das *dann?
Shenkenwen
Und muss ich den Server danach neu starten? Ich wende den obigen Code an, kann aber trotzdem nicht auf \ .json zugreifen, zu dem ich gewechselt jshabe json.
Shenkenwen
3
@shenkwen Mit *dieser Option kann jede Ursprungsdomäne auf diese Ressource zugreifen. Es ist keine Liste von Ressourcen, sondern eine Liste von referenzierenden Domänen.
SparK
3
Falls es nicht funktioniert, sollten Sie versuchen, das headersModul zu aktivieren :a2enmod headers
Joaquín O
53

Niemand sagt, dass Sie auch mod_headers aktiviert haben müssen. Wenn dies immer noch nicht funktioniert, versuchen Sie Folgendes :

(Die folgenden Tipps funktionieren unter Ubuntu, Sie kennen keine anderen Distributionen.)

Sie können die Liste der geladenen Module mit überprüfen

apache2ctl -M

Um mod_headers zu aktivieren, können Sie verwenden

a2enmod headers

Natürlich müssen Sie Apache nach allen Änderungen neu starten:

/etc/init.d/apache2 restart

Dann können Sie verwenden

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

Und wenn mod_headers nicht aktiv ist, wird diese Zeile überhaupt nichts tun. Sie können versuchen, die if-Klausel zu überspringen und sie einfach Header set Access-Control-Allow-Origin "*"in Ihre Konfiguration einzufügen. Dann sollte beim Start ein Fehler ausgegeben werden, wenn mod_headers nicht aktiv ist.

Lukas Liesis
quelle
3
Ich habe alle Optionen ausprobiert, die ich bei Google finden konnte, und wie Sie sagten, hat niemand etwas über mod_headers gesagt. Danken!
Sirkong
1
Meine mod_headers sind aktiv und haben diese Zeile in .htaccess (dieselbe Stelle wie erwähnt) hinzugefügt, aber es wird immer noch der folgende Fehler angezeigt: Die Antwort für Preflight hat einen ungültigen HTTP-Statuscode 400..Pls vorschlagen!
Sushivam
1
mod_headers war das fehlende Ding! Dies funktioniert perfekt mit der .htaccess-Regel. Danke dir.
Andy
@SachinS ein 400er Fehler wurde nicht gefunden, 500 ist ein Serverfehler. Beginnen Sie dort.
Andy
30

meiner Erfahrung nach;

wenn es nicht von innen heraus funktioniert phptut dies in .htaccesses für mich gearbeitet

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin http://www.vknyvz.com  
    Header set Access-Control-Allow-Credentials true
</IfModule>
  • Anmeldeinformationen können abhängig von Ihren Ajax-Anforderungsparametern wahr oder falsch sein
vknyvz
quelle
Das hat bei mir nicht funktioniert, aber ich konnte es in PHP zum Laufen bringen, das gleiche Prinzip.
RevNoah
14

Fügen Sie .htaccessIhrem Schriftartenordner eine Datei mit den folgenden Anweisungen hinzu, wenn Sie Probleme beim Zugriff auf Ihre Schriftarten haben. Kann leicht für die Verwendung mit CSS- oder JS- Dateien geändert werden.

<FilesMatch "\.(eot|ttf|otf|woff)$">
    Header set Access-Control-Allow-Origin "*"
</FilesMatch>
Thoman
quelle
1
Es ist zu beachten, dass die obige <FilesMatch>Anweisung nicht erforderlich ist, wenn sich Ihre .htaccessDatei , wie oben vorgeschlagen, in Ihrem Schriftartenverzeichnis befindet und Ihr Schriftartenverzeichnis nur enthält .eot,. ttf, .otfUnd / oder .woffDateien.
Mesagoma
9

Die anderen Antworten haben bei mir nicht funktioniert, das hat letztendlich den Trick für Apache2 gemacht:

1) Aktiviere den Header Mod:

sudo a2enmod headers

2) Erstellen Sie die /etc/apache2/mods-enabled/headers.confDatei und fügen Sie Folgendes ein:

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

3) Starten Sie Ihren Server neu:

sudo service apache2 restart

Songololo
quelle
Dies ist die einzige Lösung, die auf meinem Ubuntu 16.10-Server für mich funktioniert hat.
Kneeki
Das hat auch bei mir funktioniert. Ich benutze Ubuntu 16.04 Server. Danke dir.
Jhedm
Arbeitete für mich unter Ubuntu 18.04. Firefox 70.0.1 war jedoch nicht nur mit dem Access-Control-Allow-Origin-Header zufrieden, und ich musste auch die Access-Control-Allow-Methoden hinzufügen.
Borizzzzz
@songololo Ich konnte diese Datei für Apache in Centos 7 nicht finden. Ich habe überall im Verzeichnis / etc / httpd gesucht. Können Sie mir bitte mitteilen, wie ich es auf Centos implementieren kann?
Mainuddin
@ Mainuddin, sorry, ich bin nicht mit Centos vertraut. Hoffentlich kann sich jemand anderes
einschalten
7

In Zend Framework 2.0 hatte ich dieses Problem. Kann auf zwei Arten gelöst werden .htaccess oder PHP-Header Ich bevorzuge .htaccess, also habe ich .htaccess geändert von:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

zu

RewriteEngine On

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

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

und es fängt an zu arbeiten


quelle
Das hat mir den Tag gerettet, PHP konnte nicht funktionieren, also hat htaccess es geschafft.
Relm
4

Übrigens: Die .htaccess-Konfiguration muss auf dem Server erfolgen, auf dem sich die API befindet. Wenn Sie beispielsweise eine AngularJS-App auf der x.com-Domäne erstellen und eine Rest-API auf y.com erstellen, sollten Sie Access-Control-Allow-Origin "*" in der .htaccess-Datei im Stammordner von y.com und nicht auf x festlegen .com :)

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

Stellen Sie auch, wie Lukas erwähnt hat, sicher, dass Sie mod_headers aktiviert haben, wenn Sie Apache verwenden

Saman Shafigh
quelle
1

Stellen Sie sicher, dass keine Weiterleitung stattfindet. Dies kann passieren, wenn Sie den abschließenden Schrägstrich nicht in die URL aufnehmen.

Weitere Informationen finden Sie in dieser Antwort unter https://stackoverflow.com/a/27872891/614524

JDavis
quelle
0

Wenn Ihr Host nicht pvn oder dediziert ist, ist es schwierig, den Server neu zu starten.

Bessere Lösung von mir, bearbeiten Sie einfach Ihre CSS-Datei (in einer anderen Domain oder Ihrer Subdomain), die Schriftart eot, woff usw. zu Ihrer Herkunft aufruft (Ihre Domain oder www Ihre Domain). es wird dein Problem lösen.

Ich meine, relative URL auf CSS zu absoluter URL-Ursprungsdomäne bearbeiten

Hans Ganteng
quelle