352

我正在Sencha Touch 2 应用程序(包装在PhoneGapAjax.request中)中创建远程 PHP 服务器。

来自服务器的响应如下:

XMLHttpRequest 无法加载http://nqatalog.negroesquisso.pt/login.php。Access-Control-Allow- Originhttp://localhost:8888不允许 Origin。

我该如何解决这个问题?

4

18 回答 18

383

不久前我写了一篇关于这个问题的文章,Cross Domain 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') ?>
于 2012-04-13T14:54:20.963 回答
64

如果您无法控制服务器,您可以简单地将这个参数添加到您的 Chrome 启动器--disable-web-security

请注意,我不会将其用于正常的“网上冲浪”。作为参考,请参阅这篇文章:在 Chrome 中禁用同源策略

如果您使用 Phonegap 实际构建应用程序并将其加载到设备上,这将不是问题。

于 2012-04-13T16:50:49.933 回答
42

如果您使用的是 Apache,只需添加:

<ifModule mod_headers.c>
    Header set Access-Control-Allow-Origin: *
</ifModule>

在您的配置中。这将导致您的网络服务器的所有响应都可以从 Internet 上的任何其他站点访问。如果您打算只允许特定服务器使用您主机上的服务,您可以将 替换*为原始服务器的 URL:

Header set Access-Control-Allow-Origin: http://my.origin.host
于 2012-08-21T07:15:58.710 回答
18

如果您有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>
于 2013-08-13T20:56:28.737 回答
15

这是我尝试使用ASP.NET MVC作为数据源来解决相同问题时弹出的第一个问题/答案。我意识到这并不能解决PHP问题,但它的相关性足以产生价值。

我正在使用 ASP.NET MVC。Greg Brant的博客文章对我有用。最终,您创建了一个属性 ,[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" );
}
于 2013-06-06T15:24:54.913 回答
10

由于 Matt Mombrea 在服务器端是正确的,您可能会遇到另一个问题,即白名单拒绝。

你必须配置你的phonegap.plist。(我使用的是旧版本的phonegap)

对于cordova,命名和目录可能会有一些变化。但步骤应该大体相同。

首先选择支持文件> PhoneGap.plist

在此处输入图像描述

然后在“外部主机”下

添加一个条目,其值可能为“ http://nqatalog.negroesquisso.pt ”,我使用 * 仅用于调试目的。

在此处输入图像描述

于 2012-04-23T04:46:10.933 回答
8

这对于需要对“www”和“非 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');
 }
于 2013-06-18T17:37:50.500 回答
7

这是因为同源策略在Mozilla Developer NetworkWikipedia上查看更多信息。

基本上,在您的示例中,您只需要从 加载http://nqatalog.negroesquisso.pt/login.php页面nqatalog.negroesquisso.pt,而不是localhost.

于 2012-04-13T14:51:30.883 回答
7

我在使用各种 API 时遇到过几次。通常快速解决方法是添加“&callback=?” 到字符串的末尾。有时&符号必须是字符代码,有时是“?”:“?callback =?” (请参阅Forecast.io API 使用 jQuery

于 2012-12-19T00:07:14.857 回答
7

我会给你一个简单的解决方案。就我而言,我无权访问服务器。在这种情况下,您可以更改Google Chrome浏览器中的安全策略以允许 Access-Control-Allow-Origin。这很简单:

  1. 创建 Chrome 浏览器快捷方式
  2. 右键单击快捷方式图标 -> 属性 -> 快捷方式 -> 目标

简单粘贴进去"C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-security

位置可能不同。现在通过单击该快捷方式打开 Chrome。

于 2013-10-16T04:01:55.230 回答
7

如果您正在编写 Chrome 扩展程序并收到此错误,请确保您已将 API 的基本 URL 添加到您manifest.json权限块中,例如:

"permissions": [
    "https://itunes.apple.com/"
]
于 2014-02-01T18:18:22.173 回答
6

如果您在 apache 下,只需将 .htaccess 文件添加到您的目录中,其中包含以下内容:

Header set Access-Control-Allow-Origin: *

Header set Access-Control-Allow-Headers: content-type

Header set Access-Control-Allow-Methods: *
于 2015-09-02T18:31:50.333 回答
5

如果你在 Angular.js 中得到这个,那么确保你像这样转义你的端口号:

var Project = $resource(
    'http://localhost\\:5648/api/...', {'a':'b'}, {
        update: { method: 'PUT' }
    }
);

有关它的更多信息,请参见此处

于 2013-04-18T09:23:16.723 回答
5

Ruby on Rails中,您可以在控制器中执行以下操作:

headers['Access-Control-Allow-Origin'] = '*'
于 2013-09-03T15:51:49.567 回答
5

Access-Control-Allow-Origin: *您可以通过使浏览器在 HTTP OPTIONS 的响应中包含标头来使其在不修改服务器的情况下工作。

在 Chrome 中,使用此扩展程序。如果您在 Mozilla 上,请检查此答案

于 2015-04-07T12:26:30.627 回答
4

我们在 chrome 中测试的 phonegap 应用程序也有同样的问题。我们每天在打开 Chrome 之前使用下面的批处理文件的一台 Windows 机器。请记住,在运行此之前,您需要从任务管理器中清除所有 chrome 实例,或者您可以选择 chrome 以不在后台运行。

批处理:(使用 cmd)

cd D:\Program Files (x86)\Google\Chrome\Application\chrome.exe --disable-web-security
于 2013-03-11T06:37:12.497 回答
1

在红宝石辛纳屈

response['Access-Control-Allow-Origin'] = '*' 

对于每个人或

response['Access-Control-Allow-Origin'] = 'http://yourdomain.name' 
于 2015-06-07T20:16:51.847 回答
0

当您收到请求时,您可以

var origin = (req.headers.origin || "*");

而不是当你必须回应这样的事情时:

res.writeHead(
    206,
    {
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Allow-Origin': origin,
    }
);
于 2014-09-09T23:10:26.763 回答