如果服务器端代码托管在不同的域上,ajax会运行吗?

时间:2012-03-01 11:24:04

标签: javascript ajax

我打开了Firefox的暂存器并输入了......

function ajaxRequest()
{
var xmlhttp;
var domainName = location.host;
var url = 'http://leke.dyndns.org/cgi/dn2ipa/resolve-dns.py?domainName=';
url = url + domainName + '&x=' + Math.random(); // x= to avoid browser caching;

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)
    {
    alert(domainName+'='+xmlhttp.responseText);
    }
  }
xmlhttp.open("GET",url,true);
xmlhttp.send();
}

ajaxRequest();

为什么我的ajax代码与远程脚本(http://leke.dyndns.org)在同一个域中工作,但在其他域(如http://stackoverflow.com)中却没有?

如果有帮助,这里是cgi方......

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os, cgi, cgitb, socket
cgitb.enable()

cgiData = cgi.FieldStorage() # Domain Name
domainName = cgiData.getvalue('domainName')
ipa = socket.gethostbyaddr(domainName)
sendIpa = ipa[2][0]

print 'Content-Type: text/html;charset=utf-8'
print ""
print sendIpa

2 个答案:

答案 0 :(得分:2)

不,它不会。这是设计(same origin policy)并且是为了防止cross site scripting攻击。

如果你真的必须使用JSONP,你可以绕过它,但不建议这样做,因为你可能允许另一个网站(即使你信任网站管理员也可能被攻击者攻击)做任何他们喜欢的事情使用登录用户的数据。

答案 1 :(得分:1)

通常情况下无法完成。但如果服务器端代码托管在不同的域

,则可以运行

要实现此目的,您必须在服务器站点下面进行更改:

在服务器网站中,您必须将 Access-Control-Allow-Origin 设置为Response Header

Access-Control-Allow-Origin : * //all other domain can access

or 

Access-Control-Allow-Origin : <your_domain_name> // only your domain can access

检查:https://developer.mozilla.org/en/http_access_control

[实施例]

您可以对来自不同域的http://xyz.com?x=a网址进行成功的ajax调用。如果http://xyz.com?x=a网址的回复标题包含您的域名或“*”的Access-Control-Allow-Origin字段,则为if和ony。