Access-Control-Allow-Origin不允许使用Origin

Ric*_*rdo 331 javascript ajax xmlhttprequest cross-domain cors

我正在Ajax.request使用Sencha Touch 2应用程序(包装在PhoneGap中)创建一个远程PHP服务器.

服务器的响应如下:

XMLHttpRequest无法加载http://nqatalog.negroesquisso.pt/login.php.原产地http://localhost:8888不被访问控制允许来源允许的.

我该如何解决这个问题?

Mat*_*rea 374

我前段时间写了一篇关于这个问题的文章,跨域AJAX.

如果您控制响应服务器,最简单的方法是为以下内容添加响应标头:

Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)

这将允许跨域Ajax.在PHP中,您需要修改响应,如下所示:

<?php header('Access-Control-Allow-Origin: *'); ?>
Run Code Online (Sandbox Code Playgroud)

您可以将Header set Access-Control-Allow-Origin *设置放在Apache配置或htaccess文件中.

应该注意的是,这有效地禁用了CORS保护,这很可能会使您的用户受到攻击.如果您不知道您特别需要使用通配符,则不应使用它,而应将特定域列入白名单:

<?php header('Access-Control-Allow-Origin: http://example.com') ?>
Run Code Online (Sandbox Code Playgroud)

  • JohnK,是的,通配符将允许任何域向您的主机发送请求.我建议使用您将在其上运行脚本的特定域替换星号. (25认同)
  • 这有什么安全问题吗?[这个答案](http://stackoverflow.com/a/9327231/1431728),例如,出于安全原因,"JavaScript受到"同源策略"的限制,例如,恶意脚本无法联系远程服务器并从您的网站发送敏感数据." (8认同)
  • 有趣的是,您认为甚至不应该建议使用通配符@jfrej.这一切都取决于你的目标.例如,我们使用通配符(并发布此答案)的原因是因为我们正在为任何站点构建嵌入式窗口小部件. (7认同)
  • 我会联系我的服务器提供商.谢谢 (4认同)
  • 太棒了,我把它放在我的node.js服务器文件中:response.writeHead(200,{'Content-Type':contentType,'Access-Control-Allow-Origin':'*'}); 它奏效了.谢谢! (4认同)
  • 值得注意的是,通配符Origin不能与Access-Control-Allow-Credentials一起使用 (2认同)

Tra*_*ebb 62

如果您无法控制服务器,只需将此参数添加到Chrome启动器:--disable-web-security.

请注意,我不会将此用于正常的"网上冲浪".有关参考,请参阅此帖子:在Chrome中停用相同的来源政策.

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

  • 阅读答案:**您只需将此参数添加到Chrome启动器**即可.Chrome内部没有此设置 (4认同)
  • 当然是不安全的。OP正在寻求解决安全措施的方法。 (2认同)

Rez*_*a S 42

如果你正在使用Apache,只需添加:

<ifModule mod_headers.c>
    Header set Access-Control-Allow-Origin: *
</ifModule>
Run Code Online (Sandbox Code Playgroud)

在您的配置中.这将导致您的网络服务器的所有回复都可以从互联网上的任何其他网站访问.如果您打算仅允许特定服务器使用主机上的服务,则可以使用*原始服务器的URL 替换:

Header set Access-Control-Allow-Origin: http://my.origin.host
Run Code Online (Sandbox Code Playgroud)

  • 并且不要忘记加载模块:a2enmod标头 (3认同)

Cai*_*ete 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>
Run Code Online (Sandbox Code Playgroud)

  • .NET MVC人员,请看这里!我实际上打算在我的博客上输入一个解决方案并指出这个答案,以便人们可以更容易地找到它.没有什么比试图超越.NET/MVC障碍并找到PHP/jQuery解决方案更糟糕的了.谢谢@Caio-Proiete (2认同)

bad*_*key 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用它:

[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]
public ActionResult MyVeryAvailableAction(string id)
{
    return Json( "Some public result" );
}
Run Code Online (Sandbox Code Playgroud)


小智 10

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

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

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

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

在此输入图像描述

然后在"ExternalHosts"下

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

在此输入图像描述


Fra*_*ste 7

在使用各种AP​​I时,我已经遇到过这种情况.通常快速解决方法是添加"&callback =?" 到一个字符串的结尾.有时,&符必须是字符代码,有时是"?":"?callback =?" (请参阅使用jQuery的Forecast.io API用法)


lew*_*sid 7

对于需要对引荐来源的"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');
 }
Run Code Online (Sandbox Code Playgroud)


Dib*_*ish 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.


小智 6

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

"permissions": [
    "https://itunes.apple.com/"
]
Run Code Online (Sandbox Code Playgroud)


chi*_*aos 6

如果你在apache下,只需使用以下内容将.htaccess文件添加到你的目录:

Header set Access-Control-Allow-Origin: *

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

Header set Access-Control-Allow-Methods: *
Run Code Online (Sandbox Code Playgroud)


ant*_*rat 5

这是因为同源政策.有关Mozilla Developer Network或Wikipedia的更多信息,请参阅.

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


Mar*_*ius 5

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

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

有关详细信息,请参见此处.


fuz*_*lej 5

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

headers['Access-Control-Allow-Origin'] = '*'
Run Code Online (Sandbox Code Playgroud)


for*_*een 5

您可以通过Access-Control-Allow-Origin: *在HTTP OPTIONS的响应中使包括标题的broswer来使其无需修改服务器.

在Chrome中,使用此扩展程序.如果你在Mozilla上,请检查这个答案.


归档时间:

查看次数:

672879 次

最近记录:

7 年,8 月 前