我在做一个Ajax。请求一个远程PHP服务器在Sencha Touch 2应用程序(包装在PhoneGap)。

服务器的响应如下:

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

我该如何解决这个问题?


当前回答

如果你有ASP。Net / asp。NET MVC应用程序,您可以通过Web包含此头文件。配置文件:

<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>

其他回答

这可能对任何需要为引用器的'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');
 }

我曾经写过一篇关于这个问题的文章,Cross Domain AJAX。

如果你有响应服务器的控制权,最简单的方法是添加一个响应头:

Access-Control-Allow-Origin: *

这将允许跨域Ajax。在PHP中,你需要像这样修改响应:

<?php header('Access-Control-Allow-Origin: *'); ?>

你可以把头集Access-Control-Allow-Origin *设置放在Apache配置或htaccess文件中。

应该注意的是,这将有效地禁用CORS保护,这很可能使您的用户暴露在攻击之下。如果你不知道你特别需要使用通配符,你不应该使用它,相反,你应该把你的特定域列入白名单:

<?php header('Access-Control-Allow-Origin: http://example.com') ?>

这是我在尝试使用ASP解决相同问题时出现的第一个问题/答案。NET MVC作为数据源。我知道这并不能解决PHP的问题,但是它与PHP的关系是有价值的。

我使用ASP。净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" );
}

如果你在apache下,只需添加一个。htaccess文件到你的目录,内容如下:

Header set Access-Control-Allow-Origin: *

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

Header set Access-Control-Allow-Methods: *

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

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

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

Header set Access-Control-Allow-Origin: http://my.origin.host