允许通过Access-Control-Allow-Origin头允许远程API访问(Nginx / Openresty)

我有一个由Nginx(Openresty发布)运行的API,运行在http://v1.api.macamera.be/

当我桌面计算机上的前端应用程序(Vue2)从我的API请求GET时,在网页上显示以下"网络错误"。

控制台输出为:

无法加载http://v1.api.macamera.be/event/:
所请求的资源上没有'No Access-Control-Allow-Origin'头。
因此不允许访问'http://127.0.0.1:8081'

Openresty是默认版本,内置模块'headers-more-nginx-module-0.33'

为解决此问题我尝试了以下方法:

服务器{
    听       80;
#    收听443 ssl;

    server_name v1.api.macamera.be; 
#    server_name 127.0.0.1;

 # 包含片段/ ssl-params.conf; 
#        ssl_certificate /etc/letsencrypt/live/v1.api.macamera.be/fullchain.pem;
#        ssl_certificate_key /etc/letsencrypt/live/v1.api.macamera.be/privkey.pem;

根/data/sites/v1.api.macamera.be; 

    访问日志/data/sites/v1.api.macamera.be/logs/access.log;
    错误日志/data/sites/v1.api.macamera.be/logs/error.log;

 #为了避免浏览器中的网络错误(稍后要进行微调 !!):
#       add_header 'Access-Control-Allow-Origin' '*';
#       add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
 #操作更多设置头'Access-Control-Allow-Origin:*';
 more_set_input_headers "Access-Control-Allow-Origin:*";

位置/事件{
 postgres_pass macamera;
 rds_json on;
 postgres_query HEAD GET "SELECT * FROM event";

 postgres_escape $ event_id $ arg_event_id; 
 postgres_escape $ camera_id $ arg_camera_id; 
 postgres_escape $ date $ arg_date; 
 postgres_escape $ file $ arg_file; 
 postgres_query
 POST "INSERT INTO event(event_id,camera_id,date,file)VALUES($event_id$camera_id$date$file)RETURNING* ";
 postgres_rewrite POST changes 201; 
} 

位置~ / event /(?<event_id>\ d +) {
 postgres_pass macamera;
 rds_json启用;
 postgres_escape $escaped_event_id $ event_id; 
 postgres_query HEAD GET "SELECT * FROM event WHERE event_id = $escaped_event_id"; 
 postgres_rewrite HEAD GET no_rows 410; 

 postgres_escape $ title $ arg_title; 
 postgres_escape $ body $ arg_body; 
 postgres_query
 PUT"UPDATE articles SET title = $ title,body = $ body WHERE id = 2 RETURNING * ";
 postgres_rewrite PUT no_changes 410; 

#      postgres_query    DELETE  "DELETE FROM articles WHERE id=$escaped_id";
 postgres_query DELETE "DELETE FROM articles WHERE id = 3"; 
 postgres_rewrite DELETE no_changes 410; 
 postgres_rewrite DELETE changes 204; 
} 

} 

尽管我使用了"more \ _set \ _headers 'Access-Control-Allow-Origin:\ *';"指令,但仍然会出现错误。

这里是从GET操作中获得的一些调试信息:

[![网络错误调试:](https://i.stack.imgur.com/1Z1bW.png)](https://i.stack.imgur.com/1Z1bW.png)

点赞
用户3378395
用户3378395

通过将以下代码从 location 域移到 server 域已解决问题:

more_set_headers    'Access-Control-Allow-Origin: *';

不过我们仍然对于 openresty 为何不接受在 location 下使用该指令感到有兴趣。据文档所述,它应该是可以的。

2018-09-12 12:34:19