htaccess Access-Control-Allow-Origin

137

Tworzę skrypt, który ładuje się zewnętrznie w innych witrynach. Ładuje CSS i HTML i działa dobrze na moich własnych serwerach.

Jednak gdy próbuję go na innej stronie internetowej, wyświetla ten okropny błąd:

Access-Control-Allow-Origin

Tutaj możesz zobaczyć, że ładuje się idealnie: http://tzook.info/bot/

Ale na tej innej stronie pokazuje błąd: http://cantloseweight.co/robot/

Wgrałem skrypt ładowania do jsfiddle: http://jsfiddle.net/TL5LK/

Próbowałem edytować plik htaccess w ten sposób:

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

Lub tak:

Header set Access-Control-Allow-Origin *

Ale to nadal nie działa.

Tzook Bar Noy
źródło

Odpowiedzi:

280

Spróbuj tego w .htaccess w zewnętrznym folderze głównym:

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

A jeśli dotyczy to tylko skryptów .js, powinieneś zawinąć powyższy kod w to:

<FilesMatch "\.(js)$">
...
</FilesMatch>
vifargent
źródło
6
Świetna rada dotycząca używania FilesMatch.
Nate
2
Jeśli dopasujemy pliki, dodając blok filesmatch, co z tego *zrobi?
shenkwen
1
Czy po wykonaniu tej czynności muszę ponownie uruchomić serwer? Stosuję powyższy kod, ale nadal nie daje mi on dostępu do \ .json, zmieniłem jsna json.
shenkwen,
4
@shenkwen Zezwala *dowolnej domenie pochodzenia na dostęp do tego zasobu. To nie jest lista zasobów, ale lista odwołań do domen.
SparK
4
Jeśli to nie zadziała, spróbuj włączyć headersmoduł:a2enmod headers
Joaquín O
57

nikt nie mówi, że musisz mieć również włączone mod_headers , więc jeśli nadal nie działa, spróbuj tego:

(poniższe wskazówki działają na Ubuntu, nie wiem o innych dystrybucjach)

możesz sprawdzić listę załadowanych modułów za pomocą

apache2ctl -M

aby włączyć mod_headers, których możesz użyć

a2enmod headers

oczywiście po jakichkolwiek zmianach w Apache trzeba go zrestartować:

/etc/init.d/apache2 restart

Następnie możesz użyć

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

A jeśli mod_headers nie jest aktywne, ta linia nic nie zrobi. Możesz spróbować pominąć klauzulę if i po prostu dodać Header set Access-Control-Allow-Origin "*"do swojej konfiguracji, to powinno wyświetlić błąd podczas startu, jeśli mod_headers nie jest aktywny.

Lukas Liesis
źródło
3
wypróbowuję wszystkie opcje, jakie mogłem znaleźć w Google i, jak powiedziałeś, nikt nie powiedział nic o mod_headers. Podziękować!
Sirkong
1
Moje mod_headers są aktywne i dodałem tę linię w .htaccess (w tym samym miejscu, co wspomniano), ale nadal otrzymuję ten błąd: Odpowiedź dla inspekcji wstępnej ma nieprawidłowy kod statusu HTTP 400..Pls sugerują!
Sushivam
1
brakowało mod_headers! Działa to doskonale z regułą .htaccess. Dziękuję Ci.
Andy
@SachinS nie znaleziono błędu 400, 500 to błąd serwera. Zacznij tam.
Andy
30

z mojego doświadczenia;

jeśli to nie działa od wewnątrz, phpzrób to w .htaccessmoim przypadku

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin http://www.vknyvz.com  
    Header set Access-Control-Allow-Credentials true
</IfModule>
  • poświadczenia mogą być prawdziwe lub fałszywe, w zależności od parametrów żądania Ajax
vknyvz
źródło
To nie zadziałało dla mnie, ale udało mi się to uruchomić w PHP, na tej samej zasadzie.
RevNoah
17

Dodaj .htaccessplik z następującymi dyrektywami do folderu czcionek, jeśli masz problemy z dostępem do czcionek. Można go łatwo zmodyfikować do użytku z plikami .css lub .js .

<FilesMatch "\.(eot|ttf|otf|woff)$">
    Header set Access-Control-Allow-Origin "*"
</FilesMatch>
Thoman
źródło
1
Należy zauważyć, że powyższa <FilesMatch>dyrektywa jest niepotrzebna, jeśli , jak sugerowano powyżej, Twój .htaccessplik jest w katalogu czcionek , a nasz katalog czcionek tylko zawiera .eot,. ttf, .otfI / lub .woffpliki.
Mesagoma,
9

Inne odpowiedzi nie działały dla mnie, oto, co ostatecznie załatwiło sprawę dla Apache2:

1) Włącz mod nagłówków:

sudo a2enmod headers

2) Utwórz /etc/apache2/mods-enabled/headers.confplik i wstaw:

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

3) Uruchom ponownie serwer:

sudo service apache2 restart

songololo
źródło
To jedyne rozwiązanie, które działało dla mnie na moim serwerze Ubuntu 16.10.
kneeki,
To zadziałało również dla mnie. Używam serwera Ubuntu 16.04. Dziękuję Ci.
jhedm
Pracował dla mnie na Ubuntu 18.04. Firefox 70.0.1 nie był zadowolony tylko z nagłówka Access-Control-Allow-Origin i musiałem dodać również nagłówek Access-Control-Allow-Methods.
borizzzzz
@songololo Nie mogłem zlokalizować tego pliku dla Apache w Centos 7. Szukałem wszędzie w katalogu / etc / httpd. Czy możesz mi dać znać, jak mogę to zaimplementować w Centos?
Mainuddin
@Mainuddin, przepraszam, nie znam Centosa. Miejmy nadzieję, że ktoś inny się do tego
przyłączy
7

W Zend Framework 2.0 miałem ten problem. Można to rozwiązać na dwa sposoby .htaccess lub nagłówek php, wolę .htaccess, więc zmodyfikowałem .htaccess z:

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

do

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]

i zaczyna działać


źródło
To uratowało mi dzień, php couddnt pracy, więc htaccess to zrobił.
Relm
4

BTW: konfigurację .htaccess należy wykonać na serwerze obsługującym API. Na przykład, gdy tworzysz aplikację AngularJS w domenie x.com i tworzysz Rest API na y.com, powinieneś ustawić Access-Control-Allow-Origin „*” w pliku .htaccess w głównym folderze y.com, a nie x .com :)

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

Jak wspomniał Lukas, upewnij się, że masz włączone mod_headers, jeśli używasz Apache

Saman Shafigh
źródło
1

Upewnij się, że nie dzieje się przekierowanie. Może się tak zdarzyć, jeśli nie umieścisz końcowego ukośnika w adresie URL.

Zobacz tę odpowiedź, aby uzyskać więcej informacji - https://stackoverflow.com/a/27872891/614524

JDavis
źródło
0

Jeśli twój host nie jest na pvn lub dedykowany, trudno jest zrestartować serwer.

Lepsze rozwiązanie ode mnie, po prostu edytuj swój plik CSS (w innej domenie lub subdomenie), który wywołuje czcionkę eot, woff itp. Do Twojego pochodzenia (twoja-domena lub www twoja_domena). to rozwiąże twój problem.

Mam na myśli, edytuj względny adres URL w css do domeny pochodzenia bezwzględnego adresu URL

Hans Ganteng
źródło