[英]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.