9

Tôi đang cố thực hiện cuộc gọi AJAX từ một số miền đến một miền duy nhất sẽ xử lý yêu cầu. Bật miền chéo trong Firefox và Chrome dễ dàng bằng cách đặt tiêu đề trên máy chủ xử lý:Kiểm soát truy cập đối với các yêu cầu trang web chéo trong Internet Explorer

header("Access-Control-Allow-Origin: *"); 

Nhưng điều này không giúp bật tính năng này trong Internet Explorer. Khi tôi thử:

httpreq.send(''); 

nó dừng với lỗi Truy cập bị từ chối.

Làm cách nào để bật tính năng này trong Internet Explorer?

+0

IE 10 hoạt động tốt, IE8/9 với giới hạn. Xem http://caniuse.com/#search=cors – gavenkoa

+0

Những giới hạn cụ thể của hỗ trợ CORS trong IE9 là gì? – Umopepisdn

Trả lời

5

Tôi không tin bạn có thể làm điều đó trực tiếp trong Internet Explorer. Bạn có một vài tùy chọn:

  • Thiết lập tập lệnh chuyển tiếp proxy trên máy chủ mà bạn kiểm soát có thể chuyển tiếp các yêu cầu Ajax. Hãy chắc chắn rằng nó chỉ chuyển tiếp đến các đích thích hợp mà bạn cần để bạn không bị biến thành một relay ẩn danh.

  • Sử dụng thủ thuật document.domain. Về cơ bản, bạn cần phải tạo một tập hợp các iframe s, một cho mỗi máy chủ bạn cần để thực hiện cuộc gọi Ajax đến. Trong mỗi iframe đặt thuộc tính document.domain để khớp chính xác với miền bạn cần gửi yêu cầu Ajax đến. Về cách điền dữ liệu cần thiết, hãy sử dụng thao tác DOM trước khi đặt document.domain. Lưu ý rằng thủ thuật này yêu cầu các máy chủ đích phải nằm trong các tên miền phụ của bản gốc. Xem thêm trong this article, với các ví dụ.

+0

Xin lỗi vì đã trả lời muộn. Tôi đã thực hiện nó với kịch bản proxy trên máy chủ. –

1

Đối với Internet Explorer 8, bạn cần phải làm như thế cho FF3, tức là sử dụng tiêu đề "Access-Control-Allow-Origin" và sử dụng đối tượng XDomainRequest thay vì XMLHttpRequest. Mọi thứ đều chi tiết ở đây cho IE8: http://msdn.microsoft.com/en-us/library/dd573303%28VS.85%29.aspx

Các hương vị cũ hơn của IE không hỗ trợ Cross Site Access Control cũng như các đối tượng XDomainRequest. Tuy nhiên nó không phải là kết thúc, bạn có thể nghỉ mát để lừa IFrame ví dụ, tức là tạo ra một IFrame vô hình mà các cuộc gọi chức năng của bạn như được mô tả ở đây: http://softwareas.com/cross-domain-communication-with-iframes

0

Chỉ cần thêm vào câu trả lời của Eric, cho phiên bản cũ của trình duyệt IE, bạn có thể sử dụng phương pháp $ .ajax jquery 1.4.2, đó theo mặc định cho phép các yêu cầu miền chéo, hoặc cho tên miền chéo JSON, bạn có thể sử dụng

jQuery.getJSON (string url, dữ liệu bản đồ, Chức năng gọi lại) trả XMLHttpRequest

Trích từ tài liệu Jquery.

"jQuery hiện hỗ trợ JSONP nguyên bản - nếu bạn cố gắng tải JSON (thông qua $ .getJSON hoặc $ .ajax) từ một URL từ xa thì một cuộc gọi lại sẽ được cung cấp cho máy chủ để diễn giải."

+0

Để làm rõ, điều này * chỉ * hoạt động cho các yêu cầu jsonp. jQuery không cung cấp hỗ trợ cho XDomainRequest và các cách giải quyết yêu cầu jQuery 1.5 hoặc mới hơn: http://bugs.jquery.com/ticket/8283 –

3

tôi đã IE8 và 9 làm việc chỉ với jQuery $ .ajax (jQuery phiên bản 1.7.2)

jQuery.support.cors = true; 
jQuery(function() { 
$.ajax({ 
    crossDomain : true, 
    dataType: 'html', 
    //... 
    }); 
}); 
12

Đã có nhiều thay đổi kể từ lần đầu tiên tôi gửi giải pháp của tôi cho CORS trong IE7 trở lên. Đầu tiên của thuộc tính jQuery $ .support.cors là true theo mặc định,.NET framework 4.0 trở lên không còn hỗ trợ CORS như được thực hiện trong các phiên bản 3.5.1 và thấp hơn. Khi viết một dịch vụ web với ASP.NET 4.0 tôi đã cài đặt Thinktecture.IdentityModel có sẵn như là một gói NuGet. Sau đó, trong phương pháp Application_Start của tập tin Global.asax, thêm:

void Application_Start(object sender, EventArgs e) 
{ 
    Thinktecture.IdentityModel.Http.Cors.IIS.UrlBasedCorsConfiguration.Configuration 
     .ForResources("*") 
     .ForOrigins("http://localhost:80, http://mydomain") 
     .AllowAll() 
     .AllowMethods("GET", "POST"); 
} 

Bây giờ thêm các yếu tố httpProtocol trong system.webServer:

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Headers" value="Content-Type, Accept, X-Requested-With, X-File-Name" /> 
    <add name="Access-Control-Allow-Methods" value="GET, POST" /> 
    </customHeaders> 
</httpProtocol> 

My $ .ajax gọi bây giờ là:

$.ajax({ 
    url: serviceUrl, 
    data: JSON.stringify(postData), 
    type: "POST", 
    cache: false, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: onSuccess, 
    error: onError 
}); 
+0

Khi câu hỏi này lần đầu tiên được đăng lên IE 6 và 7 vẫn còn rất phổ biến, và chúng không có hỗ trợ nào của CORS cả. Tôi không tin rằng '$ .support.cors' đã được thực hiện sau đó. Điều tốt để biết mọi thứ đã được cải thiện! – Dan

+0

từ http://api.jquery.com/jQuery.support/ "... cors là bằng true nếu trình duyệt có thể tạo đối tượng XMLHttpRequest và nếu đối tượng XMLHttpRequest đó có thuộc tính withCredentials. Để bật yêu cầu miền chéo trong môi trường không hỗ trợ cors được nêu ra nhưng không cho phép yêu cầu XHR miền chéo (tiện ích cửa sổ, vv), thiết lập $ .support.cors = true; ... ". Tôi đã xác minh điều này hoạt động trong IE7, IE8 và IE9. –

+0

trình tiết kiệm cuộc sống. Cảm ơn bạn đã đăng bài này. –

5

Bạn đã thử kích hoạt Tên miền chéo nguồn dữ liệu truy cập enter image description here

+1

nó rất hữu ích để kiểm tra trang web trên localhost: 8080 –

+0

Làm việc như một sự quyến rũ. Thực sự hữu ích để kiểm tra trên localhost +1 – CocoHot

Các vấn đề liên quan