Набор заголовков Access-Control-Allow-Origin в .htaccess не работает

Я не могу понять, почему мои настройки заголовка .htaccess не работают.

Содержимое моего .htaccess файла:

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]

Но когда я удаляю Header и добавляю их в index.php, все работает нормально.

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

Что мне не хватает?


person user1401592    schedule 17.05.2012    source источник


Ответы (10)


Это должно работать:

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"
person imbrizi    schedule 27.07.2012
comment
Не забудьте активировать заголовки модулей апача a2enmod headers - person Lucas Serafim; 07.04.2014
comment
Исправлено: Метод PUT не разрешен с помощью Access-Control-Allow-Methods. - person Rahul Prasad; 03.05.2014
comment
Кроме того, в этом случае лучше использовать Header set. Если код изменен и он ДЕЙСТВИТЕЛЬНО устанавливает заголовок, если Apache выполнит header add, будут отправлены двойные ** заголовки. Например, это сломает таких клиентов, как Restangular. - person Julian; 07.03.2015
comment
Не забудьте, если нужно, Header add Access-Control-Allow-Credentials "true" - person Marco Marsala; 05.05.2016

Просто для протокола: я столкнулся с той же проблемой, и ни один из ответов не помог.

Я использовал инструмент проверки заголовков: http://www.webconfs.com/http-header-check.php

Я тестировал свой IP (http://192.0.2.1/upload) и получил следующее:

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

Произошло перенаправление, и запрос AJAX не учитывает/отслеживает перенаправления.

Оказалось, что в конце домена отсутствует косая черта (http://192.0.2.1/upload/)

Я снова проверил с косой чертой в конце, и я получил это ниже. Добавил косую черту в скрипт, и теперь он работает.

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

Используйте этот инструмент, чтобы проверить, хороши ли ваши заголовки, и устранить неполадки в том, что происходит.

person Miro    schedule 10.01.2015
comment
У меня сейчас открыто 11 вкладок, пытаясь решить эту проблему. Этот ответ должен быть в большем количестве мест. - person JDavis; 17.11.2016
comment
В моем случае мне нужно было удалить косую черту. Так рад, что нашел это. Потратил так много времени на устранение неполадок, когда я узнал, что это должно было работать несколько часов назад. - person gorelog; 24.01.2018

У меня есть виртуальный хостинг на GoDaddy. Мне тоже нужен был ответ на этот вопрос, и после поиска я обнаружил, что это возможно.

Я написал файл .htaccess, поместил его в ту же папку, что и моя страница действий. Вот содержимое файла .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"

Вот мой вызов 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
    });

См. эту статью для справки:

Заголовок устанавливает Access-Control-Allow-Origin в .htaccess не работает

person TARKUS    schedule 02.05.2013

Будьте осторожны с:

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

Совершенно неразумно предоставлять доступ всем. Желательно разрешить список только известных доверенных хостов...

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"

С уважением,

person Alex    schedule 07.10.2016
comment
Это не сработает. Access-Control-Allow-Origin не может иметь несколько значений. Вам необходимо динамически установить заголовок на основе значения заголовка запроса Origin. - person Quentin; 11.03.2019

Я активировал заголовки модулей Apache a2enmod, и проблема была решена.

person truthblue82    schedule 10.12.2015
comment
Ошибки в журнале не были ясны в отношении того, почему изменения, которые я вносил, потерпят неудачу, и этот ответ очень помог. sudo a2enmod headers и перезагрузка заработала! - person cchana; 31.08.2018

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

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

Будьте осторожны: заголовок добавляет Access-Control-Allow-Origin "*" Это неразумно предоставлять доступ всем. Я думаю, вы должны использовать:

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

Я поставил +1 ответу Миро за ссылку на сайт проверки заголовков http://www.webconfs.com/http-header-check.php. Каждый раз, когда вы его используете, появляется неприятная реклама, но, тем не менее, он очень полезен для проверки наличия заголовка Access-Control-Allow-Origin.

Я читаю файл .json из javascript на своей веб-странице. Я обнаружил, что добавление следующего в мой файл .htaccess решило проблему при просмотре моей веб-страницы в IE 11 (версия 11.447.14393.0):

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

Я также добавил следующее в /etc/httpd.conf (файл конфигурации Apache):

AllowOverride All

Сайт проверки заголовков подтвердил, что заголовок Access-Control-Allow-Origin теперь отправляется (спасибо, Миро!).

Однако Firefox 50.0.2, Opera 41.0.2353.69 и Edge 38.14393.0.0 все равно извлекают файл, даже без заголовка Access-Control-Allow-Origin. (Примечание: они могут проверять IP-адреса, поскольку два домена, которые я использовал, размещены на одном сервере с одним и тем же адресом IPv4.)

Однако Chrome 54.0.2840.99 m (64-разрядная версия) игнорирует заголовок Access-Control-Allow-Origin и все равно дает сбой, ошибочно сообщая:

В запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Следовательно, доступ к источнику '{mydomain}' запрещен.

Я думаю, что это должно быть что-то вроде "первого". IE работает корректно; Chrome, Firefox, Opera и Edge содержат ошибки; а Chrome — худший. Разве это не полная противоположность обычному случаю?

person Dave Burton    schedule 14.12.2016

Потратив полдня ничего не работая. С помощью службы проверки заголовков, хотя все работало. Брандмауэр на работе лишил их

person Matt in Washington    schedule 06.04.2016

попробуй это:

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

Желательно разрешить список известных доверенных хостов.

person behnam shateri    schedule 10.04.2019

Если кто-то еще пытается это сделать, ответ, получивший наибольшее количество голосов, должен сработать. Однако, если у вас возникли проблемы, возможно, браузер кэшировал REQUEST. Для подтверждения добавьте строку запроса.

person Simon Song    schedule 26.09.2019