29

我試圖做一個互聯網上的服務器(http)之間的ajax調用。並將其指向我自己的本地主機。 FF/Chrome/ETC ...的作品。這只是一個IE問題。 IM使用IE 11和10.訪問被拒絕在IE 10和11當ajax目標是本地主機

該請求甚至沒有完成。 「拒絕訪問」立即被拋出。

這是代碼。只爲你看。

IE8 AND IE9中不是經典的HTTP/HTTPS錯誤。這是別的,但文檔沒有幫助。

$jq.ajax({ 
      contentType: 'application/json', 
      url: url, 
      dataType: 'json', 
      crossDomain: true, 
      beforeSend: function (xhr) { 
       xhr.withCredentials = true; 
       xhr.setRequestHeader("Authorization", "Basic " + $jq.base64.encode(username and password)); 
      }, 
      success: function (data, status, headers) {}, 
      error: function (xhr, status, error) {} 

狀態是xhr對象0和錯誤是「拒絕訪問」

回答

38

Internet Explorer中引發此錯誤作爲其安全區功能的一部分。使用默認安全設置時,嘗試從「Internet」區域中的來源訪問「本地Intranet」區域中的資源時會出現「訪問被拒絕」錯誤。

如果您手動編寫Ajax代碼,當您嘗試打開資源時,Internet Explorer會引發錯誤。例如:

var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'http://localhost/', true); // This line will trigger an error 
xhr.send(); 

您可以通過將原始站點添加到「可信站點」安全區域來解決此錯誤。您可以通過將「http://client.cors-api.appspot.com」添加到「受信任的站點」區域並使用此測試頁面test-cors.org將localhost站點用作遠程URL來測試此操作。

+1

但是如果你的JS正在被其他人運行並且你不能改變他們的IE安全設置呢?這解決了一臺計算機的問題....但不是部署的代碼。 – theUtherSide

+0

@theUtherSide如果您的代碼正在部署到本地主機,那麼您將已經在用戶的工作站上部署/安裝某些東西。如果您有權訪問其工作站,則可以更改其IE安全設置。如果您的用戶正在手動部署/安裝,則可以在安裝說明中包含IE安全設置更改。 – oobug

+0

@oobug這正是我的觀點 - 這個答案只適用於你有權改變IE安全設置的情況。這很好,如果你有一些內部應用程序,但它不適用於野生百葉窗網站上的JS代碼。 – theUtherSide

3

如果你正試圖使IE9跨域Ajax請求,你需要使用XDomainRequest而不是XMLHttpRequest。有一個包裝XDR的jQuery插件。您應該知道XDR有一些顯着的限制。

另一種選擇是使用這樣的庫:https://github.com/jpillora/xdomain

2

jQuery使用IE9不支持的XMLHttpRequest對象實現ajax調用。您必須強制它使用XDomainRequest

我避開使用這個jQuery插件這個問題:

https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest

+7

OP明確表示這是IE10/11。 XDomainRequest僅適用於IE9及更低版本。 –

+1

用戶更新了他的問題 - 之前他沒有指出IE版本,所以我認爲它是9. –

+0

第一個鏈接已經死亡。 –

14

除了可信站點要求之外,我發現問題並沒有解決,直到我對請求使用了與我的原點相同的協議,例如,我的測試網站託管在https上,但沒有任何目的地使用http(沒有s)。

這隻適用於IE瀏覽器,Chrome只是禮貌地在調試控制檯中記錄警告並且不會失敗。

-5

注:

不要使用 「http://www.domain.xxx」 或 「http://localhost/」 或 「IP」 爲URL阿賈克斯。 只使用路徑(目錄)和沒有地址的頁面名稱。

假狀態:

var AJAXobj = createAjax(); 
AJAXobj.onreadystatechange = handlesAJAXcheck; 
AJAXobj.open('POST', 'http://www.example.com/dir/getSecurityCode.php', true); 
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); 
AJAXobj.send(pack); 

真實狀態:

var AJAXobj = createAjax(); 
AJAXobj.onreadystatechange = handlesAJAXcheck; 
AJAXobj.open('POST', 'dir/getSecurityCode.php', true); // <<--- note 
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); 
AJAXobj.send(pack); 



function createAjax() 
{ 
    var ajaxHttp = null; 
    try 
    { 
     if(typeof ActiveXObject == 'function') 
      ajaxHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
     else 
     if(window.XMLHttpRequest) 
      ajaxHttp = new XMLHttpRequest(); 
    } 
    catch(e) 
    { 
     alert(e.message); 
     return null; 
    } 
    //------------- 
    return ajaxHttp; 
};