角度ajax调用OPTIONS请求超时,可能是CORS问题

时间:2014-11-26 05:16:17

标签: ajax angularjs nginx cors

我有一个运行在不同服务器上的网络应用程序(www.webapp.com),尝试使用我的后端休息服务器(api.example.com)进行api调用。我试图通过Web浏览器与Web应用程序进行交互,但是ajax调用无法正常工作。例如,尝试向api.example.com/endpoint发出请求。

有什么线索我在这里失踪了吗?

在Chrome的控制台上,我得到:

OPTIONS https://api.example.com/endpoint net::ERR_CONNECTION_TIMED_OUT

在Firefox的控制台上,我得到:

OPTIONS https://api.example.com/endpoint [250ms]  
null

我正在使用nginx为其余服务器提供服务。 nginx.conf的location部分包含:

location /{
     proxy_pass http://127.0.0.1:5000;

     add_header 'Access-Control-Allow-Header' 'Origin, Content-Type, Accept, Authorization';
     add_header 'Access-Control-Allow-Methods' 'POST, GET, OPTIONS';
     add_header 'Access-Control-Allow-Origin' 'http://example.com';
     if ($request_method = 'OPTIONS') {
         add_header 'Access-Control-Allow-Origin' 'http://www.webapp.com';
         add_header 'Access-Control-Allow-Methods' 'POST, GET, OPTIONS';
         add_header 'Access-Control-Max-Age' '1728000';
         add_header 'Content-Type' 'text/plain; charset=UTF-8';
         return 200;
     }

2 个答案:

答案 0 :(得分:0)

我认为这份文件可以帮助你

https://github.com/angular/angular.js/issues/1972 enter link description here

我之前遇到过跨域api调用的问题..在调用之前发送一个选项调用并等待成功选项请求。我做的是我创建了一个选项处理程序,它也返回成功..我不是确定这是当前的方式,但它帮助我解决了这个问题

@POST
@Path("createNote")
@Produces(MediaType.APPLICATION_JSON)
public ResponceMsg createNotePost(@FormParam("subject") String subject,
           @FormParam("description") String description,
           @FormParam("requestId") int requestId){

    requestProcess.createNewNote(requestId,subject,description);
    return new ResponceMsg();
}

@OPTIONS
@Path("createNote")
@Produces(MediaType.APPLICATION_JSON)
public Void createNote(){
    return null;
}

答案 1 :(得分:0)

您设置后端服务器,以便知道客户端是可信任的。处理选项是供服务器容器执行的,Tomcat / Apache并没有其他工作,然后专门将客户端的URL编码到服务器配置中。

不幸的是,我不熟悉nginx,但这里有一篇讨论设置CORS的文档。 见这里:http://enable-cors.org/server_nginx.html