簡體   English   中英

向另一台服務器發出AJAX請求

[英]Making an AJAX request to another server

我有AJAX代碼,如果你請求對遠程服務器的AJAX調用請求失敗:

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

  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
      document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
    }
  }

  xmlhttp.open("GET", "http://www.google.com", true);
  xmlhttp.send();
}

我該怎么做才能解決這個問題?

看起來你已經碰到了同樣的原產地政策 您必須使用相對路徑而不是絕對的http://www.google.com路徑。

作為一種可能的解決方法,您可以設置一個非常簡單的反向代理 (如果您使用的是Apache,則使用mod_proxy )。 這將允許您在AJAX請求中使用相對路徑,而HTTP服務器將充當任何“遠程”位置的代理。

在mod_proxy中設置反向代理的基本配置指令是ProxyPass。 您通常會按如下方式使用它:

ProxyPass     /web-services/     http://third-party.com/web-services/

在這種情況下,瀏覽器將請求/web-services/service.xml但服務器將通過充當http://third-party.com/web-services/service.xml的代理來提供此服務。

另一個常見的解決方法是使用JSONP

作為安全措施,AJAX不允許您向其他域發出請求。 跨域Ajax:快速摘要討論了解決該問題的幾種方法。 最簡單的方法是使用您的服務器作為代理來下載遠程內容:

這是最常見的方法之一。 您的腳本調用您的服務器,您的服務器調用遠程服務器,然后將結果返回給客戶端。 這種方法有一些明顯的優勢:您可以更好地控制整個生命周期。 您可以從遠程服務器解析數據,在將數據發送回客戶端之前將其與您的數據進行對比。 如果在此過程中出現任何問題,您可以按照自己的方式處理。 最后,您可以記錄所有遠程呼叫。 這樣你就可以追蹤成功,失敗和受歡迎程度。

我想在最佳答案上發布另一個變體。 我試圖在我的.htaccess文件中使用ProxyPass ,但我一直收到內部服務錯誤。 經過一些閱讀后,我發現還有另一種方法可以使用重寫引擎。

RewriteEngine On
RewriteRule ^mail.php$ http://otherwebsite.com/mail.php [P,L]

[P,L]中的[P,L]告訴重寫系統它使用mod_proxy 這對我有用,我沒有得到內部服務器錯誤。

這種方法的優點是,因為它使用了Rewrite Engine ,所以您可以更好地控制動態發送到腳本所需的變量。

您可以使用動態腳本加載 這是我寫的關於它的文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM