我正在尝试从浏览器向Context Broker实例发出GET请求。
启动应用程序时,我已经使用-corsOrigin __ALL
标志在CB上启用了CORS,并且可以通过在POSTMAN中发出请求并在响应中看到此标头来看到它已起作用:{{1} }。
我需要在GET请求中指定Fiware-Service标头,以获取正确的实体,我认为该实体发出的请求不是simple,而是触发了OPTIONS HTTP请求。
Chrome检查外发请求,报告已发送以下标头:
access-control-allow-origin →*
我从上下文代理获得的响应是:
Access-Control-Request-Headers: fiware-service
Access-Control-Request-Method: GET
一个previous answer by McMutton,针对类似的问题:
”对您的js代码进行必要的更改,以确保您的请求 属于简单请求的范围。”
直接从请求中删除非标准标头。但是,对我来说,我看不到任何非标准头发送。
读取Fiware documentation on Access-Control-Allow-Headers时,有一个指向the source code的链接,其中指定了允许的标头。在那里,我可以看到定义了Fiware-Service标头,但它与从浏览器发送的标头不区分大小写(浏览器已将我的标头转换为所有小写字母)。
有人知道上下文代理中的“标头检查”是否区分大小写吗?
如果不是,那还有什么问题?
编辑:此问题似乎已在此处报告: https://github.com/telefonicaid/fiware-orion/issues/3453
答案 0 :(得分:1)
基于the discussion on the associated github issue,似乎该问题是由于Context Broker相当老(版本1.7.0)引起的,并且该功能尚未在该版本中开发。
解决方案是将Context Broker更新到最新版本(目前为2.2.0)。
答案 1 :(得分:0)
感谢@fgalan,是的,该功能包含在最新的Context Broker版本中。但是,我们的系统目前非常脆弱,因此在我们放心地重建并迁移到较新版本之前,我将使用NGINX模拟选项请求的HTTP响应。
此配置在到Context Broker的其他端口上侦听请求,并在OPTIONS HTTP请求到达时发送成功响应。
如果不是OPTIONS HTTP请求,NGINX会将请求转发到Context Broker实例。
server {
listen 1885;
listen [::]:1885;
location / {
if ($request_method = OPTIONS ) {
add_header Content-Length 0;
add_header Content-Type text/plain;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Fiware-Service';
return 204;
}
proxy_pass http://xxx.xxx.xxx.xxx:1026;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}