CORS预检频道没有成功

时间:2015-07-24 19:02:35

标签: ember.js cross-domain cors ember-simple-auth

我尝试使用PHP REST框架构建一个Ember应用程序作为我的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"

任何想法或解决方案?任何帮助表示赞赏。谢谢!

4 个答案:

答案 0 :(得分:4)

您的预检OPTIONS请求是否返回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]

答案 1 :(得分:2)

一个可能的问题可能是浏览器没有缓存服务器对浏览器的OPTIONS请求的响应。要解决此问题,请尝试包含" Access-Control-Max-Age"在您的回复中标题并将其设置为' 86400' (1天)。根据关于CORS的MDN's文档,另一个问题可能是,因为您指定了特定的来源而不仅仅是对原点使用通配符响应,所以您需要包含一个" vary"响应中的标头指定来自服务器的响应将取决于请求的来源。这可以在响应中完成:

Vary: Origin

如果在OPTIONS请求成功后您的主要请求出现CORS错误,我相信您还需要包含" Access-Control-Allow-Origin"标题和" Vary"该回复中的标题也是如此。

希望这有帮助!

答案 2 :(得分:1)

正如this answer所述,正确处理飞行前OPTIONS请求是必要的,但对于跨站点资源请求的工作是不充分的。预翻后对所有后续请求的所有响应必须包括Access-Control-Allow-Headers。希望这会有所帮助。

答案 3 :(得分:1)

在服务器端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();
   }
}