Access-Control-Allow-Origin 不允许 Origin

IT技术 javascript ajax cors xmlhttprequest cross-domain
2021-01-27 00:18:09

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

来自服务器的响应如下:

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

我该如何解决这个问题?

6个回答

不久前我写了一篇关于这个问题的文章,跨域 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') ?>
我会联系我的服务器提供商。谢谢
2021-03-11 00:18:09
太棒了,我只是把它放在我的 node.js 服务器文件中: response.writeHead(200, { 'Content-Type': contentType, 'Access-Control-Allow-Origin': '*' }); 它奏效了。谢谢!
2021-03-20 00:18:09
有趣的是,您认为@jfrej 甚至不应该建议使用通配符。这一切都取决于你的目标。例如,我们使用通配符(并发布此答案)的原因是我们正在构建一个嵌入式小部件供任何站点使用。
2021-03-23 00:18:09
这有任何安全问题吗?例如,这个答案说“出于安全原因,JavaScript 受到“同源策略”的限制,例如,恶意脚本无法联系远程服务器并从您的站点发送敏感数据。
2021-04-01 00:18:09
JohnK,是的,通配符将允许任何域向您的主机发送请求。我建议将星号替换为您将在其上运行脚本的特定域。
2021-04-03 00:18:09

如果你具备服务器的控制权,你可以这种说法只是添加到您的Chrome启动:--disable-web-security

请注意,我不会将它用于正常的“网上冲浪”。如需参考,请参阅此帖子:在 Chrome 中禁用同源策略

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

谢谢。但是我的应用程序在移动设备上运行,我无法将参数传递给我的 webview 包装器。
2021-03-11 00:18:09
是的,我在 Chrome 浏览器中调试,但该应用程序不会在 chrome 上运行。它将在我无法控制的 phonegap webview 上。
2021-03-11 00:18:09
阅读答案:您只需将此参数添加到 Chrome 启动器即可Chrome 中没有此设置
2021-04-06 00:18:09
你不先在浏览器中测试你的应用程序吗?你如何调试?
2021-04-07 00:18:09
当然是不安全的。OP 正在寻求绕过安全措施的方法。
2021-04-08 00:18:09

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

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

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

Header set Access-Control-Allow-Origin: http://my.origin.host
如何加载module:a2enmod 头文件?
2021-03-26 00:18:09
并且不要忘记加载module:a2enmod headers
2021-04-02 00:18:09

如果您有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>
谢谢它对我有用。我已经在服务器端代码项目(web.config)中添加了。
2021-03-31 00:18:09
.NET MVC 人们,看这里!我实际上将输入一个解决方案并在我的博客上指向这个答案,以便人们可以更轻松地找到它。没有什么比试图越过 .NET/MVC 障碍并且只找到 PHP/jQuery 解决方案更糟糕的了。谢谢@Caio-Proiete
2021-04-04 00:18:09
为什么这对我不起作用?我正在使用 Chrome 并尝试从我的本地主机访问雅虎财经页面。
2021-04-04 00:18:09

这是在尝试使用ASP.NET MVC作为我的数据源解决相同问题时出现的第一个问题/答案我意识到这并不能解决PHP问题,但它足够有value。

我正在使用 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" );
}
WebApi 2 现在内置了这个。asp.net/web-api/overview/security/...
2021-03-16 00:18:09