2015-01-18 22 views
5

Próbuję załadować dane do okna dialogowego jQuery przez ajax, ale żądanie nie działa w przeglądarce Firefox (34.0.5). Działa dobrze i nie dostaję żadnych skarg w Chrome i Safari.CORS nie działa w przeglądarce Firefox

My apache conf zawiera:

Header set Access-Control-Allow-Origin "*" 
Header set Access-Control-Allow-Methods: "PUT, GET, POST, DELETE, OPTIONS" 
Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept" 

JQuery jest prosta:

$('#dialog').load('example.php', function() { $('#dialog').dialog('open'); }); 

Firefox reaguje z następującym błędem konsoli:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://www.example.com/example.php. This can be fixed by moving the resource to the same domain or enabling CORS.

sprawdzając nagłówki odpowiedzi od żądanie ajax wszystkie wydają się być nienaruszone i inline z tym, co zostało zadeklarowane w apache. Czy powinienem dołączyć inną dyrektywę lub zmienić konfigurację w jakiś sposób, żeby to zadziałało?

AKTUALIZACJA: U podstaw problemu leży fakt, że chciałbym, aby zarówno example.com jak i www.example.com działały tak samo. Dana witryna zawsze ma tag w nagłówku <base href="www.example.com" /> w obu przypadkach, ponieważ jest to część domyślnej struktury serwisu. Odkąd odkryłem, że usunięcie tego linku umożliwia żądanie ajaxowi pracy na example.com, nawet jeśli nadal w sposób konkretny wywołuje zasób z poddomeny www.

Co ciekawe, wiele aspektów nagłówków zapytań i odpowiedzi zmienia się po usunięciu tego znacznika. Dla każdego, kto może mieć pojęcia o implikacjach, wklejam poniżej oba nagłówki żądania i odpowiedzi.

Oto nagłówki z tagiem <base> usunięte. W tym przypadku ajax połączenie zostało nawiązane:

RESPONSE

HTTP/1.1 200 OK 
    Date: Sun, 18 Jan 2015 22:11:04 GMT 
    Server: Apache/2.4.7 (Ubuntu) 
    X-Powered-By: PHP/5.5.9-1ubuntu4.5 
    Set-Cookie: PHPSESSID=xxx; path=/; HttpOnly 
    language=en; expires=Tue, 17-Feb-2015 22:11:04 GMT; Max-Age=2592000; path=/; domain=www.example.com 
    currency=CAD; expires=Tue, 17-Feb-2015 22:11:04 GMT; Max-Age=2592000; path=/; domain=www.example.com 
    Expires: Thu, 19 Nov 1981 08:52:00 GMT 
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, public 
    Pragma: no-cache 
    Content-Encoding: gzip 
    access-control-allow-methods: PUT, GET, POST, DELETE, OPTIONS 
    access-control-allow-origin: * 
    access-control-allow-headers: Origin, X-Requested-With, Content-Type, Accept 
    Content-Length: 1515 
    Connection: close 
    Content-Type: text/html; charset=utf-8 

WNIOSEK

GET /example.php HTTP/1.1 
    Host: www.example.com 
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:34.0) Gecko/20100101 Firefox/34.0 FirePHP/0.7.4 
    Accept: text/html, */*; q=0.01 
    Accept-Language: en-US,en;q=0.5 
    Accept-Encoding: gzip, deflate 
    Referer: http://example.com/ 
    Origin: http://example.com 
    x-insight: activate 
    Connection: keep-alive 
    Cache-Control: max-age=0 

A oto nagłówki z <base> tag nienaruszone. Te nagłówki odzwierciedlają scenariusz, w którym wywołano wywołanie ajax. Warto zauważyć, że pole 'miejsce' w nagłówku odpowiedzi mówi 'https', mimo że to nie dzieje się przez połączenie HTTPS:

RESPONSE

HTTP/1.1 302 Found 
    Date: Sun, 18 Jan 2015 22:12:26 GMT 
    Server: Apache/2.4.7 (Ubuntu) 
    X-Powered-By: PHP/5.5.9-1ubuntu4.5 
    Set-Cookie: PHPSESSID=xxx; path=/; HttpOnly 
    language=en; expires=Tue, 17-Feb-2015 22:12:26 GMT; Max-Age=2592000; path=/; domain=www.example.com 
    currency=CAD; expires=Tue, 17-Feb-2015 22:12:26 GMT; Max-Age=2592000; path=/; domain=www.example.com 
    Expires: Thu, 19 Nov 1981 08:52:00 GMT 
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, public 
    Pragma: no-cache 
    Status: 302 
    Location: https://www.example.com/index.php 
    access-control-allow-methods: PUT, GET, POST, DELETE, OPTIONS 
    access-control-allow-origin: * 
    access-control-allow-headers: Origin, X-Requested-With, Content-Type, Accept 
    Content-Length: 0 
    Connection: close 
    Content-Type: text/html 

WNIOSEK

OPTIONS /example.php HTTP/1.1 
    Host: www.example.com 
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:34.0) Gecko/20100101 Firefox/34.0 FirePHP/0.7.4 
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
    Accept-Language: en-US,en;q=0.5 
    Accept-Encoding: gzip, deflate 
    Origin: http://example.com 
    Access-Control-Request-Method: GET 
    Access-Control-Request-Headers: x-requested-with 
    x-insight: activate 
    Connection: keep-alive 
    Cache-Control: max-age=0 
+0

Czy nagłówki CORS są wysyłane dwa razy? Miałem ostatnio problem, w którym błędnie dodałem go do mojego htaccess, a także moje conf apache. Spowodowało to, że wartości nagłówków zostały wysłane dwukrotnie, co spowodowało, że niektóre przeglądarki nie działały poprawnie. – JohnP

+0

Nie, nie mogę tego zobaczyć. Nie mam niczego ustawionego w .htaccess tylko apache vhost conf - choć myślę, że może się również zdarzyć, jeśli użyjesz 'Header add' zamiast' Header set'. W tej chwili widzę je tylko raz w nagłówkach odpowiedzi. – billynoah

+0

Mam podobny problem (działa on w Chrome, a nie w FF), ale bez użycia tagu . – aesede

Odpowiedz

0

Zgodnie z MDN, nie można użyć symbolu wieloznacznego do "referencyjnych żądań", więc może twoje zapytanie należy do tej kategorii.

Powiązane problemy