问题是我在浏览器和 Curl 命令中得到不同的 header 响应
我在本地主机的 8081 端口上有 mypage.com(客户端 html/css/js)由 nginx 提供服务。
我在 http://mypage.com:8081 上通过浏览器访问它(mypage.com 映射到/etc/hosts 上的 -> 127.0.0.1)。
页面加载正常,它执行第一个 jQuery 请求。
GET http://mypage.com:8081/api/foo
我已经让 Tomcat 8 在端口 :9090 上运行我的 2 个 REST API
因为目标是:8081 请求在 nginx 中得到解析
location /services
proxy_pass http://127.0.0.1:9090/services/
location /api
proxy_pass http://127.0.0.1:9090/api/
** =======到目前为止一切正常。==========**
JQuery 中的第二个请求是
GET http://mypage.com:9090/services/foo
由于浏览器中的当前页面是 mypage.com:8081 并且 JQuery 调用的目标是 mypage.com:9090/services/foo ;浏览器检测到 CORS 请求。
在请求中,'来源:http://mypage.com:8081 ' header 已设置,但没有 Access-Control-Allow-Origin 返回。它根本没有。
OPTIONS http://mypage.com:9090/ returns 403 **ONLY in the browser**
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://mypage.com:9090/service/bar (Reason: CORS header 'Access-Control-Allow-Origin' missing).
我已经检查了 Tomcat 的配置,添加了 CORS 过滤器,当我执行与浏览器相同的命令时,我可以通过 CURL 确认一切正常。
我正在为这个而兜圈子。 - 在这两种情况下都设置了 CORS Origin header - 在 Browser 中,结果是 403 并且响应 header 除了
之外不显示任何其他内容Content-Length: 87
Content-Type: text/plain;charset=ISO-8859-1
Date: Wed, 23 Dec 2015 01:11:53 GMT
Server: Apache-Coyote/1.1
- 虽然在 curl 命令中,相同的请求会产生一个响应,其中 Access-Control-Allow-Origin 设置为请求 header 上传递的来源。
问题:为什么浏览器 OPTIONS 没有返回 Access-Control-Allow-Origin?我似乎无法通过使用具有相同参数的相同动词但通过 CURL 命令点击相同的 URL 来重现它
最佳答案
最后我发现了这个问题。
根据 Tomcat 的 CORS 流程图,我将问题缩小到我从客户端发送的 header 与后端支持的 header 之间存在不匹配这一事实。
解决方案是通过添加我的自定义 header 来覆盖 tomcat 过滤器中的默认值
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>....,X-My-Custom,...</param-value>
</init-param>
关于javascript - CORS header 'Access-Control-Allow-Origin' 仅在浏览器/jquery 中丢失,但可以使用 curl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34427315/