Ember.js CORS飞行前频道未成功

Ember.js CORS飞行前频道未成功,ember.js,cross-domain,cors,ember-simple-auth,Ember.js,Cross Domain,Cors,Ember Simple Auth,我正在尝试用PHP REST框架作为本地api构建一个Ember应用程序。余烬应用程序正在http://localhost:4200而api仅从http://localhost。这导致了CORS问题。我已经尝试了我能想到的一切,但我不断收到一个错误,说请求被阻止,飞行前频道没有成功。它在Firefox或Chrome上都不成功 我已将以下内容添加到api的.htaccess文件中: Header set Access-Control-Allow-Methods "GET, POST, OPTION

我正在尝试用PHP REST框架作为本地api构建一个Ember应用程序。余烬应用程序正在
http://localhost:4200
而api仅从
http://localhost
。这导致了CORS问题。我已经尝试了我能想到的一切,但我不断收到一个错误,说请求被阻止,飞行前频道没有成功。它在Firefox或Chrome上都不成功

我已将以下内容添加到api的
.htaccess
文件中:

Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header set Access-Control-Allow-Origin "http://localhost:4200"
Header set Access-Control-Allow-Credentials true
Header set Access-Control-Allow-Headers "accept, content-type"
以下是我的请求标题:

Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://localhost:4200
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
和响应标题:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: accept, content-type
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Origin: http://localhost:4200
Connection: close
Content-Type: text/html; charset=utf-8
Date: Fri, 24 Jul 2015 17:10:49 GMT
Server: Apache/2.4.9 (Win64) PHP/5.5.12
Set-Cookie: 24fd751c8630b64fcf935a94e8bcef46=qih6pfnqo94d4cgi5b5d79h4i6; path=/
Transfer-Encoding: chunked
X-Powered-By: PHP/5.5.12
p3p: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"

有什么想法或解决方案吗?感谢您的帮助。谢谢

如前所述,正确处理飞行前选项请求是必要的,但不足以让跨站点资源请求发挥作用。prefligh之后对任何后续请求的所有响应必须包括访问控制允许标头。希望这有帮助。

一个可能的问题可能是浏览器没有缓存服务器对浏览器选项请求的响应。要解决此问题,请尝试在响应中包含“Access Control Max Age”标题,并将其设置为类似“86400”(1天)的值。根据CORS上的文档,另一个问题可能是,由于您指定的是特定的来源,而不仅仅是对来源使用通配符响应,因此您需要在响应中包含“vary”头,以指定来自服务器的响应将取决于请求的来源。这可以在如下响应中完成:

Vary: Origin
如果在成功的选项请求之后,您的主请求出现CORS错误,我相信您还需要在响应中包含“访问控制允许来源”标题和“更改”标题


希望这有帮助

您的飞行前
选项
请求返回200吗?您可以尝试使用.htaccess返回200响应,如下所示:

Header always set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header always set Access-Control-Allow-Origin "http://localhost:4200"
Header always set Access-Control-Allow-Credentials true
Header always set Access-Control-Allow-Headers "accept, content-type"

RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

在服务器端servlet中,添加标题并返回200状态。来自RESTFul WCF服务的示例,其中在Global.asax文件中添加了以下代码

protected void Application_AuthenticateRequest(object sender, EventArgs e){
    Response.AddHeader("Access-Control-Allow-Origin", "*");
    if (Context.Request.HttpMethod.Equals("OPTIONS")) {
        Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
        Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        Response.StatusCode = (int)System.Net.HttpStatusCode.OK;
        Context.ApplicationInstance.CompleteRequest();
   }
}

谢谢,但我没有任何自定义头,甚至还没有达到这个目的。既然你没有设置任何自定义头,为什么要在你的请求中设置访问控制允许头?我没有看到内容类型标题集,因此它似乎是不必要的。它是。这只是为了让它工作。据我所知,这真的不必要。@NicholasJohn16我理解您在问题中粘贴的请求是飞行前选项请求,还是您试图发送的原始HTTP请求?这是飞行前选项请求。它从来没有到达我试图发送的POST请求。不,因为CORS问题,它返回500。我编写了js代码,并将其移动到同一个域中,它工作得非常完美。唯一的问题是CORS.Hi。我正在使用AngularJS与WooCommerceAPI进行交互。我可以获取数据,但当我尝试一篇文章时,我得到了错误
响应,因为飞行前的HTTP状态代码401无效。非常感谢您的帮助。