Ajax ile jQuery iletişim kutusuna veri yüklemeye çalışıyorum ancak Firefox'ta istek başarısız oluyor (34.0.5). İyi çalışıyor ve Chrome ve Safari’de şikayetim yok.CORS Firefox'ta çalışmıyor
Benim apache conf içerir:
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 basitçe:
$('#dialog').load('example.php', function() { $('#dialog').dialog('open'); });
Firefox aşağıdaki konsol hata ile yanıt verir:
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.
gelen yanıt başlıklarını incelenmesi ajax istekleri hepsinin sağlam olduğu görülüyor Apache'de bildirilenlerle satır içi. Başka bir yönerge de dahil etmeli mi yoksa bu işlemin yapılabilmesi için bir şekilde konfigürasyonu değiştirmeli miyim?
GÜNCELLEME: Sorunun kökünde, aynı işlevi görmesi için hem example.com
hem de www.example.com
olmasını isterim. Söz konusu sitenin, her zaman varsayılan site çerçevesinin bir parçası olduğu için her zaman <base href="www.example.com" />
başlığında bir etiketi vardır. Bu bağlantıyı kaldırmanın, ajax isteminin example.com üzerinde çalışmasına izin verdiğinden, özellikle de www alt etki alanından bir kaynağı özellikle çağırdığında bile keşfettim.
İlginçtir ki, bu etiket kaldırıldığında istek ve yanıt başlıklarının birçok yönü değişir. Burada imalar hakkında bir ipucu olabilecek herkes için aşağıdaki istek ve cevap başlıklarını da yapıştırıyorum.
Burada, <base>
etiketinin kaldırılmış üstbilgileri var.
TEPKİ
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
Ve burada <base>
etiketi bozulmamış ile başlık olduğu
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
TALEBİ: Bu durumda ajax çağrı başarılı oldu. Bu başlıklar, ajax çağrısının başarısız olduğu senaryoyu yansıtır.
RESPONSE'u
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
İSTEĞİ
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
: Bu cevap başlığında 'Yer' alan bu bir https bağlantısı üzerinden olmuyordu rağmen 'https' diyor dikkati çekiyor
CORS başlıklarının iki kez mi gönderiliyor? Yakın zamanda, benim htaccess'e eklediğim ve benim apache'mdeki conf'ime eklediğim yeni bir problemim vardı. Bu, üstbilgi değerlerinin iki kez gönderilmesine neden oldu; bu da bazı tarayıcıların düzgün çalışmamasına neden oldu. – JohnP
Göremediğimden değil. .htaccess'te sadece bir apache vhost conf ayarlanmış bir şeyim yok - yine de “Header add” yerine “Header add” i kullanırsanız bunun olabileceğini düşünün. Öyle olduğu için sadece yanıt başlıklarında bir kez görüyorum. – billynoah
Benzer bir sorun yaşıyorum (Chrome'da çalışır, FF'de değil) ancak etiketi kullanılmadan. –
aesede