Zestaw nagłówków Access-Control-Allow-Origin w .htaccess nie działa

91

Nie mogę zrozumieć, dlaczego moje .htaccessustawienia nagłówka nie działają.

.htaccessZawartość mojego pliku:

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]

Ale kiedy usuwam Headeri dodam je, index.phpwszystko działa dobrze.

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

Czego mi brakuje?

user1401592
źródło

Odpowiedzi:

135

To powinno działać:

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"
imbrizi
źródło
46
Nie zapomnij aktywować nagłówków modułów apachea2enmod headers
Lucas Serafim,
1
Naprawiono: „Metoda PUT nie jest dozwolona przez metody kontroli dostępu”
Rahul Prasad
6
W Header settym przypadku najlepiej jest użyć . Jeśli kod zostanie zmieniony i ustawia nagłówek, to Apache wykona a header addwyśle ​​podwójne ** nagłówki. Zepsuje to na przykład klientów, takich jak Restangular.
Julian
2
Nie zapomnij, jeśli to konieczne,Header add Access-Control-Allow-Credentials "true"
Marco Marsala
20

Tak dla porządku, napotkałem dokładnie ten sam problem i żadna z odpowiedzi nie zadziałała.

Użyłem narzędzia do sprawdzania nagłówków: http://www.webconfs.com/http-header-check.php

Testowałem z moim adresem IP ( http://192.0.2.1/upload) i otrzymałem następujące informacje:

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

Nastąpiło przekierowanie, a żądanie AJAX nie honoruje / śledzi przekierowań.

Okazało się, że to brakujący ukośnik na końcu domeny ( http://192.0.2.1/upload / )

Przetestowałem ponownie ze slashem na końcu i otrzymałem to poniżej. Dodano również ukośnik w skrypcie i teraz działa.

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

Użyj tego narzędzia, aby sprawdzić, czy nagłówki są dobre i rozwiązać problem.

Miro
źródło
5
Mam teraz otwartych 11 kart, próbując rozwiązać ten problem. Ta odpowiedź powinna być w większej liczbie miejsc.
JDavis
Z moim musiałem usunąć końcowy ukośnik. Tak się cieszę, że to znalazłem. Spędziłem tak dużo czasu na rozwiązywaniu tego, kiedy nowy, powinien działać kilka godzin temu.
gorelog
11

Mam wspólny hosting w GoDaddy. Potrzebowałem odpowiedzi na to pytanie i po rozejrzeniu się stwierdziłem, że jest to możliwe.

Napisałem plik .htaccess, umieściłem go w tym samym folderze, co moja strona akcji. Oto zawartość pliku .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"

Oto moje wywołanie 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
    });

Zobacz ten artykuł w celach informacyjnych:

Zestaw nagłówków Access-Control-Allow-Origin w .htaccess nie działa

TARKUS
źródło
8

Uważaj na:

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

Udzielanie dostępu każdemu nie jest wcale rozsądne. Lepiej jest zezwolić tylko na listę znanych zaufanych hostów ...

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"

Pozdrowienia,

Alex
źródło
3
To nie zadziała. Access-Control-Allow-Origin nie może mieć wielu wartości. Musisz dynamicznie ustawić nagłówek na podstawie wartości nagłówka żądania Origin.
Quentin
7

Aktywowałem nagłówki a2enmod nagłówków modułu Apache i problem został rozwiązany.

trueblue82
źródło
Błędy w dzienniku nie były jasne, dlaczego zmiany, które wprowadzałem, zawiodły, a ta odpowiedź bardzo pomogła. sudo a2enmod headersi ponowne uruchomienie sprawiło, że działa!
cchana
3

Spróbuj tego w .htaccess w zewnętrznym folderze głównym

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

Uważaj na: nagłówek dodaj Access-Control-Allow-Origin "*" To nie jest rozsądne, aby przyznawać dostęp wszystkim. Myślę, że powinieneś użyć:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://example.com"
</IfModule>
Vo Quoc Cuong
źródło
3

Dałem +1 odpowiedzi Miro za łącze do strony sprawdzania nagłówków http://www.webconfs.com/http-header-check.php . Za każdym razem, gdy go używasz, wyświetla nieprzyjemną reklamę, ale mimo to jest bardzo przydatna do weryfikowania obecności nagłówka Access-Control-Allow-Origin.

Czytam plik .json z javascript na mojej stronie internetowej. Zauważyłem, że dodanie następującego pliku do mojego pliku .htaccess rozwiązało problem podczas przeglądania mojej strony internetowej w IE 11 (wersja 11.447.14393.0):

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

Dodałem również do /etc/httpd.conf (plik konfiguracyjny Apache):

AllowOverride All

Witryna sprawdzająca nagłówki potwierdziła, że ​​nagłówek Access-Control-Allow-Origin jest teraz wysyłany (dzięki, Miro!).

Jednak Firefox 50.0.2, Opera 41.0.2353.69 i Edge 38.14393.0.0 i tak pobierają plik, nawet bez nagłówka Access-Control-Allow-Origin. (Uwaga: mogą sprawdzać adresy IP, ponieważ obie domeny, których używałem, są hostowane na tym samym serwerze, pod tym samym adresem IPv4).

Jednak przeglądarka Chrome 54.0.2840.99 m (64-bitowa) ignoruje nagłówek Access-Control-Allow-Origin i mimo wszystko kończy się niepowodzeniem, błędnie zgłaszając:

Żądany zasób nie zawiera nagłówka „Access-Control-Allow-Origin”. Dlatego źródło{mydomain} ” nie ma dostępu.

Myślę, że to musi być coś w rodzaju „pierwszego”. IE działa poprawnie; Chrome, Firefox, Opera i Edge są pełne błędów; a Chrome jest najgorszy . Czy to nie jest dokładne przeciwieństwo zwykłego przypadku?

Dave Burton
źródło
0

Po spędzeniu pół dnia bez pracy. Korzystanie z usługi sprawdzania nagłówka, chociaż wszystko działało. Działająca zapora ogniowa je usuwała

Matt w Waszyngtonie
źródło
0

Spróbuj tego:

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

Lepiej jest zezwolić na listę znanych zaufanych hostów.

behnam shateri
źródło
0

Jeśli ktokolwiek inny próbuje tego, najbardziej pozytywna odpowiedź powinna zadziałać. Jeśli jednak masz problemy, być może przeglądarka zapisała ŻĄDANIE w pamięci podręcznej. Aby potwierdzić, dołącz ciąg zapytania.

Simon Song
źródło