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

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

My .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: *");

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

Ответ 1

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

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"

Ответ 2

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

Я использовал инструмент проверки заголовков: 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

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

Ответ 3

У меня есть хостинг на 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 не работает

Ответ 4

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

 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"

С Уважением,

Ответ 5

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

Ответ 6

Попробуйте это в .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>

Ответ 7

I + 1'd Miro ответит на ссылку на сайт заголовка 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 (спасибо, Miro!).

Тем не менее, 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 м (64-разрядный) игнорирует заголовок Access-Control-Allow-Origin и в любом случае терпит неудачу, ошибочно сообщает:

Нет заголовка "Access-Control-Allow-Origin" присутствует в запрошенном ресурс. Следовательно, Origin '{mydomain}' не допускается.

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

Ответ 8

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

Ответ 9

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

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

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

Ответ 10

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