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


91

Я не могу понять, почему мои .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: *");

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

Ответы:


135

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

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"

46
Не забудьте активировать заголовки модуля apachea2enmod headers
Лукас Серафим

1
Исправлено: «Метод PUT не разрешен Access-Control-Allow-Methods»
Рахул Прасад

6
Также лучше всего использовать Header setв этом случае. Если код изменен и он ДЕЙСТВИТЕЛЬНО устанавливает заголовок, Apache header addотправит двойные ** заголовки. Это, например, нарушит работу таких клиентов, как Restangular.
Джулиан

2
Не забывайте, если нужно,Header add Access-Control-Allow-Credentials "true"
Марко Марсала

20

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

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

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


5
У меня сейчас открыто 11 вкладок, пытаясь решить эту проблему. Этот ответ должен быть в других местах.
JDavis

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

11

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


8

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

 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"

С Уважением,


3
Это не сработает. Access-Control-Allow-Origin не может использовать несколько значений. Вам необходимо динамически установить заголовок на основе значения заголовка запроса Origin.
Квентин

7

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


Ошибки в журнале были непонятны относительно того, почему внесенные мной изменения потерпят неудачу, и этот ответ очень помог. sudo a2enmod headersи перезагрузка заставила его работать!
cchana

3

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

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

Будьте осторожны: Header add Access-Control-Allow-Origin "*" Совершенно неразумно предоставлять доступ всем. Я думаю, вам следует:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://example.com"
</IfModule>

3

Я добавил +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 содержат ошибки; а Хром хуже всего . Разве это не полная противоположность обычному случаю?


0

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


0

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

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

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


0

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

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