Набір заголовків 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 м (64-розрядна версія) ігнорує заголовок Access-Control-Allow-Origin і в будь-якому випадку не працює, помилково повідомляючи:

На запитаному ресурсі немає заголовка 'Access-Control-Allow-Origin'. Таким чином, походженню " {mydomain} " заборонено доступ.

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


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.