htaccess Access-Control-Allow-Origin


134

Я создаю скрипт, который загружается извне на других сайтах. Он загружает CSS и HTML и отлично работает на моих собственных серверах.

Тем не менее, когда я пробую его на другом сайте, он отображает эту ужасную ошибку:

Access-Control-Allow-Origin

Здесь вы можете видеть, что он отлично загружается: http://tzook.info/bot/

Но на этом другом сайте он показывает ошибку: http://cantloseweight.co/robot/

Я загрузил скрипт загрузки в jsfiddle: http://jsfiddle.net/TL5LK/

Я попытался отредактировать файл htaccess так:

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

Или вот так:

Header set Access-Control-Allow-Origin *

Но все равно не работает.

Ответы:


270

Попробуйте это в .htaccess внешней корневой папки:

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

И если это касается только скриптов .js, вы должны обернуть вышеупомянутый код в это:

<FilesMatch "\.(js)$">
...
</FilesMatch>

6
Отличный совет по использованию FilesMatch.
Nate

1
если мы сопоставляем файлы, добавляя блок filesmatch, то что делает *?
shenkwen

И мне нужно перезагрузить сервер после этого? Я применяю код выше , но он все равно не даст мне доступ \ .json, я изменил jsк json.
shenkwen

3
@shenkwen Разрешает *любому домену происхождения доступ к этому ресурсу. Это не список ресурсов, а список ссылающихся доменов.
SparK

3
Если это не сработает, попробуйте включить headersмодуль:a2enmod headers
Joaquín O

53

никто не говорит, что у вас также должны быть mod_headers включить , поэтому, если он все еще не работает, попробуйте это:

(следующие советы работают на Ubuntu, не знаю о других дистрибутивах)

Вы можете проверить список загруженных модулей с

apache2ctl -M

чтобы включить mod_headers вы можете использовать

a2enmod headers

конечно после любых изменений в Apache вы должны перезапустить его:

/etc/init.d/apache2 restart

Тогда вы можете использовать

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

И если mod_headers не активен, эта строка вообще ничего не будет делать. Вы можете попробовать пропустить предложение if и просто добавить его Header set Access-Control-Allow-Origin "*"в свою конфигурацию, тогда он должен выдать ошибку во время запуска, если mod_headers не активен.


3
пробовал все варианты, которые мог найти в Google, и, как вы сказали, никто ничего не сказал о mod_headers. Спасибо!
Sirkong

1
Мои заголовки mod_headers активны и добавили эту строку в .htaccess (в том же месте, что и упомянутое), но все равно получаю эту ошибку: Ответ на предполетную проверку имеет недопустимый код состояния HTTP 400 .. Просьба предложить!
Сушивам

1
mod_headers не хватало! Это отлично работает с правилом .htaccess. Спасибо.
Энди

@SachinS ошибка 400 не найдена, 500 - ошибка сервера. Начни там.
Энди

30

из моего опыта;

если это не работает изнутри, phpсделайте это в .htaccessэто работало на меня

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin http://www.vknyvz.com  
    Header set Access-Control-Allow-Credentials true
</IfModule>
  • учетные данные могут быть истинными или ложными в зависимости от параметров запроса ajax

Это не сработало для меня, но я смог заставить его работать на php по тому же принципу.
RevNoah

16

Добавьте .htaccessфайл со следующими директивами в папку со шрифтами, если есть проблемы с доступом к шрифтам. Может быть легко изменен для использования с файлами .css или .js .

<FilesMatch "\.(eot|ttf|otf|woff)$">
    Header set Access-Control-Allow-Origin "*"
</FilesMatch>

1
Следует отметить , что приведенное выше <FilesMatch>указание не является необходимым, если , как уже говорилось выше, ваш .htaccessфайл находится в папке шрифтов и ваш каталог шрифтов только содержит .eot,. ttf, .otfи / или .woffфайлы.
Месагома 07

9

Другие ответы не сработали для меня, вот что в итоге помогло apache2:

1) Включите мод заголовков:

sudo a2enmod headers

2) Создайте /etc/apache2/mods-enabled/headers.confфайл и вставьте:

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

3) Перезагрузите сервер:

sudo service apache2 restart


Это единственное решение, которое сработало для меня на моем сервере Ubuntu 16.10.
Kneeki 05

Это сработало и для меня. Я использую сервер Ubuntu 16.04. Спасибо.
jhedm

У меня работал на Ubuntu 18.04. Однако Firefox 70.0.1 не был доволен только заголовком Access-Control-Allow-Origin, и мне также пришлось добавить заголовок Access-Control-Allow-Methods.
borizzzzz 01

@songololo Мне не удалось найти этот файл для apache в Centos 7. Я искал везде в каталоге / etc / httpd. Не могли бы вы сообщить мне, как я могу реализовать это на Centos?
Майнуддин,

@Mainuddin, извините, я не знаком с Centos. Надеюсь, кто-нибудь еще сможет
вмешаться

7

В Zend Framework 2.0 у меня была эта проблема. Может быть решено двумя способами .htaccess или заголовком php, я предпочитаю .htaccess, поэтому я изменил .htaccess из:

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

в

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]

и он начинает работать


Это спасло мне день, php couddnt поработал, поэтому htaccess сделал это.
Relm

4

Кстати: конфигурация .htaccess должна выполняться на сервере, на котором размещен API. Например, вы создаете приложение AngularJS в домене x.com и создаете Rest API на y.com, вы должны установить Access-Control-Allow-Origin «*» в файле .htaccess в корневой папке y.com, а не в x .com :)

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

Также, как упомянул Лукас, убедитесь, что вы включили mod_headers, если вы используете Apache


1

Убедитесь, что у вас не происходит перенаправление. Это может произойти, если вы не включите в URL завершающую косую черту.

Посмотрите этот ответ для более подробной информации - https://stackoverflow.com/a/27872891/614524


0

Если ваш хост не на pvn или не выделен, перезапустить сервер будет сложно.

Лучшее решение от меня, просто отредактируйте свой файл CSS (в другом домене или в вашем поддомене), который вызывает шрифт eot, woff и т. Д. Для вашего происхождения (ваш домен или www yourdomain). это решит вашу проблему.

Я имею в виду, отредактируйте относительный URL-адрес в css до домена источника абсолютного URL-адреса

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.