Ajax.request
请求。来自服务器的响应如下:
我该如何解决这个问题?XMLHttpRequest无法加载http://nqatalog.negroesquisso.pt/login.php。由于Access-Control-Allow-Origin未允许,源
http://localhost:8888
不被允许。
Ajax.request
请求。我该如何解决这个问题?XMLHttpRequest无法加载http://nqatalog.negroesquisso.pt/login.php。由于Access-Control-Allow-Origin未允许,源
http://localhost:8888
不被允许。
我之前写了一篇关于这个问题的文章,跨域 AJAX。
如果你可以控制响应服务器,处理这个问题最简单的方法是添加一个响应头:
Access-Control-Allow-Origin: *
这将允许跨域Ajax。在PHP中,您需要修改响应如下:
<?php header('Access-Control-Allow-Origin: *'); ?>
你可以将Header set Access-Control-Allow-Origin *
设置放在Apache配置文件或htaccess文件中。
需要注意的是,这实际上禁用了CORS保护,这很可能会暴露你的用户受到攻击。如果你不知道你是否需要使用通配符,那么就不要使用它,而应该将你的特定域名添加到白名单中:
<?php header('Access-Control-Allow-Origin: http://example.com') ?>
如果你没有服务器控制权,你可以在Chrome启动器中添加此参数:--disable-web-security
。
但请注意,我不建议在正常的"网页浏览"时使用这个参数。具体信息可参考此帖: 在Chrome中禁用同源策略。
一旦你使用Phonegap构建应用并将其加载到设备上,这将不再是问题。
<ifModule mod_headers.c>
Header set Access-Control-Allow-Origin: *
</ifModule>
您可以在配置中添加 *
,这将会导致您的web服务器所有响应可以从互联网上的任何其他站点访问。如果您希望只允许特定服务器使用您主机上的服务,可以将 *
替换为原始服务器的URL:
Header set Access-Control-Allow-Origin: http://my.origin.host
如果您有一个ASP.NET / ASP.NET MVC应用程序,您可以通过Web.config文件添加此标题:
<system.webServer>
...
<httpProtocol>
<customHeaders>
<!-- Enable Cross Domain AJAX calls -->
<remove name="Access-Control-Allow-Origin" />
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>
[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]
,您可以将其添加到控制器操作中。public class HttpHeaderAttribute : ActionFilterAttribute
{
public string Name { get; set; }
public string Value { get; set; }
public HttpHeaderAttribute(string name, string value)
{
Name = name;
Value = value;
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.AppendHeader(Name, Value);
base.OnResultExecuted(filterContext);
}
}
然后使用它:
[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]
public ActionResult MyVeryAvailableAction(string id)
{
return Json( "Some public result" );
}
正如Matt Mombrea所说的那样,对于服务器端,您可能会遇到另一个问题,即白名单拒绝访问。
您需要配置您的phonegap.plist文件。(我正在使用旧版本的phonegap)
对于cordova,命名和目录可能有所变化。但步骤应该大致相同。
首先选择Supporting files > PhoneGap.plist
然后在“ExternalHosts”下面
添加一个条目,值为"http://nqatalog.negroesquisso.pt" 我正在使用*仅用于调试目的。
对于需要针对引用方的“www”和“non-www”版本都进行异常处理的任何人来说,这可能会很有用:
$referrer = $_SERVER['HTTP_REFERER'];
$parts = parse_url($referrer);
$domain = $parts['host'];
if($domain == 'google.com')
{
header('Access-Control-Allow-Origin: http://google.com');
}
else if($domain == 'www.google.com')
{
header('Access-Control-Allow-Origin: http://www.google.com');
}
只需在其中粘贴 "C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-security
。
位置可能不同。现在通过单击该快捷方式打开Chrome。
在使用各种API时,我遇到了这个问题几次。通常,一个快速的解决方法是在字符串的末尾添加"&callback=?"。有时候,&符号需要用字符编码代替,有时候则是"?":"?callback=?" (参见Forecast.io API Usage with jQuery)
nqatalog.negroesquisso.pt
而不是localhost
加载http://nqatalog.negroesquisso.pt/login.php
页面。
dataType: 'jsonp'
可以解决问题。 - Amit KostiAccess-Control-Allow-Origin
,并将其报告为错误。 - troelskn