2014-09-01 47 views
0

我在Firefox和IE瀏覽器中遇到CORS問題,而Chrome似乎處理相同的情況就好了。CORS https訪問本地主機在Chrome上工作,但不在Firefox上

我有一個要求,從瀏覽器中運行的Web應用程序訪問本地貓鼬服務器。我從我的web應用程序發送XMLHTTP請求,該應用程序是一個Google App腳本 - HTMLService(從https://script.google.com提供)到運行本地主機上運行的貓鼬服務器的本地客戶端 - 127.0.0.1:1234。 XMLHTTP請求通過HTTPS(GET)發送到

https://localhost:1234/ping 

。服務器應該以「純文本」的形式回覆「PING_OK」消息。 我們也將瀏覽器指向

https://localhost:1234/ping 

有我們的測試認證接受作爲一個值得信賴的來源。 上述步驟後,Chrome瀏覽器能夠訪問本地貓鼬服務器,但Firefox失敗的消息:服務時「NS_ERROR_DOM_BAD_URI訪問受限制的URI被拒絕」(IE也失敗)

也是一個考驗html頁面來自file:///c:test.html也能夠通過Firefox和Chrome訪問

https://localhost:1234/ping 

這裏是在HTML的JavaScript:

var xmlhttp; 
    if (window.XMLHttpRequest) { 
    // code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } 
    else { 
    // code for IE6, IE5 
    xmlhttp=new ActiveXObject('Microsoft.XMLHTTP'); 
    } 


    // set the onreadystatechange callback 
    xmlhttp.onreadystatechange = function() { 
    var xStatus = ['UNSENT','OPENED','HEADERS_RECEIVED','LOADING','DONE']; 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
     var response = xmlhttp.responseText; 
     console.log('Response: '+response); 
    } else if((xmlhttp.readyState>0) && (xmlhttp.readyState<4)){ 
     console.log('state='+ xStatus[xmlhttp.readyState]+', status='+ xmlhttp.statusText); 
    } else { 
     console.log('state='+ xStatus[xmlhttp.readyState]+', status='+ xmlhttp.statusText); 
     } 
    } 


    // set the timeout value and the ontimeout callback 

    xmlhttp.timeout = 30000; 
    xmlhttp.ontimeout = function() { 
     console.log('XHR timed out'); 
    } 

    var url = 'https://localhost:1234/ping'; 
    var params = ''; 


    xmlhttp.open('POST', url, true); 
    xmlhttp.send(params); 

服務器證書是使用OpenSSL生成「」其它」(貓鼬-C++),並設置與以下選項的測試證書

這是在本地機器上的貓鼬服務器端的代碼。

void FakeWebServer::handlePingRequest(struct mg_connection *conn) { 

/// Set headers 
mg_send_header(conn, "Access-Control-Allow-Origin", "*"); 
mg_send_header(conn, "Access-Control-Allow-Methods", "POST, GET, OPTIONS"); 
mg_send_header(conn, "Access-Control-Allow-Headers", "X-PINGOTHER"); 
mg_send_header(conn, "Access-Control-Max-Age", "1728000"); 

mg_send_header(conn, "Content-Type", "text/plain"); 

/// Send Fake Message 
std::string msg = "PING_OK"; 
mg_send_data(conn, msg.c_str(), strlen(msg.c_str())); 
} 

當部署爲通過谷歌應用程序scripy web應用程序上面的代碼高高興興地工作在Chrome,但冷杉EFOX失敗「NS_ERROR_DOM_BAD_URI:訪問受限制的URI被拒絕」

我是比較新的JavaScript編程和我不知道這是否是一個SSL相關的問題我現在面臨或CORS一個...

1 )我是否缺少任何其他參數或配置在任何一端的這種SSL訪問?

2)另外爲什麼會從文件送達頁:/// * HTML能夠通過CORS訪問

https://localhost:1234 

而完全相同的HTML代碼

https://script.google.com 

服務失敗時,對Firefox(和IE)。

任何指針和建議,以解決這個問題,非常感謝。

+0

這似乎是Caja消毒的一個公開問題。 http://code.google.com/p/google-apps-script-issues/issues/detail?id=3543。 我們完全停留在這一個。我們正在尋找關於可能的黑客解決方法或替代解決方案的任何建議。 – sith 2014-09-02 03:07:29

回答

0

我遇到了類似的問題,Chrome和IE工作正常,但Firefox在使用Dojo從JavaScript調用WebAPI時失敗。事實證明,由Firefox發送的「接受」標題是不同的,並且不受我的API支持。 鉻發送此:

Accept: */* 

火狐發送此:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

所以,火狐接收500錯誤。我通過在JavaScript調用中重寫頭來解決了這個問題。以下是使用Dojo + TypeScript的代碼,但您應該可以在您的環境中執行類似的操作。

var d = new Deferred(); 
    var token = this._getToken(); 
    var options = { 
     method: 'GET', 
     handleAs: 'json', 
     headers: { 
      'Accept': '*/*', 
      'Authorization': 'Bearer ' + token 
     } 
    }; 
    request<Object>(url, options).then(
     function (result) { 
      d.resolve(result); 
     }, 
     function (err) { 
      d.reject(err, true); 
     } 
    ); 
    return d.promise; 

這只是一種解決方法。真正的問題是,由於Firefox的「Accept」頭,WebAPI試圖以XML格式返回響應。我從來沒有將我的數據傳輸對象設置爲XML格式,所以WebAPI引發了500錯誤。所以,作爲一個最終的解決方案,我刪除了從像這樣的WebAPI情況下,XMLFormatter:

config.Formatters.Remove(config.Formatters.XmlFormatter); 

一個更永久的解決辦法是使的WebAPI處理XML,但我不這樣做了。

+0

@Morris多數民衆贊成有趣的知道。如果我們再次重新訪問該項目並在此處更新,我們將嘗試。 – sith 2015-05-30 11:29:57

相關問題