选项请求失败并出现 404
Posted
技术标签:
【中文标题】选项请求失败并出现 404【英文标题】:Option request fails with 404 【发布时间】:2018-10-17 05:35:48 【问题描述】:我正在尝试将 GET 请求从我的前端发送到 API 应用程序。两者都在我的本地机器上运行。这就是它现在的构建方式:
backend <===> frontend <=x=> API application
这三个部分在各自的 docker 容器中相互独立运行,并且仅通过 HTTP 请求相互通信。
如上图所示,backend
和 frontend
之间的连接工作正常,但 frontend
和 API application
之间的连接不正常。
堆栈包括:
frontend
: 带有 vue-js 的节点服务器和我使用 axios 的请求
API application
:带有 Play Framework 2.5.14 的 Scala
当我像这样通过 curl 向她发送请求时,API 应用程序本身才能工作:
curl -X GET api-application.docker/api/user?userId=1 \
-H "Authorization: key" -H "Accept: Application/Json"
但是当我从前端调用它时,我在 OPTIONS 调用中得到 404。它还在 Firefox 中向我发出与 CORS 标头 Access-Control-Allow-Origin
相关的警告:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the
remote resource at http://api-application.docker:9000/api/user?userId=1
(Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
所以我先进入了api应用的application.conf
并添加了
play.filters.cors
allowedOrigins = ["*"]
我也尝试将星号换成http://frontend.docker:8080
这不起作用,所以我再次删除了该条目并添加了这一行:
play.filters.disabled += "play.filters.cors.CORSFilter"
仍然没有任何变化。现在我想知道我是否误解了 OPTIONS 和 CORS 之间的联系?还是我关错了?谁能帮帮我?
编辑: 我在等待答案时尝试了更多的东西,但都没有成功:
我将application.conf
中的条目改为:
play.filters.cors
allowedOrigins = null
【问题讨论】:
你好像没有关注这个playframework.com/documentation/2.5.x/… 【参考方案1】:404 on OPTIONS request 表示您的CORSFilter
未启用。由于您使用的是 Play 2.5,您可以通过添加 enable 它
libraryDependencies += filters
到您的build.sbt
,并通过创建以下app/Filters.scala
文件:
import javax.inject.Inject
import play.api.http.DefaultHttpFilters
import play.filters.cors.CORSFilter
class Filters @Inject() (corsFilter: CORSFilter)
extends DefaultHttpFilters(corsFilter)
默认情况下,所有内容都是允许的,因此在您决定开始锁定访问之前无需修改 application.conf
。您不应添加 play.filters.disabled += "play.filters.cors.CORSFilter"
,因为这会禁用 CORS 支持。
curl
请求正常工作的原因是非浏览器 HTTP 客户端不强制执行同源策略(请参阅related SO answer),因此 CORS 不适用于curl
。
404 on OPTIONS request 表示找不到以下路由:
OPTIONS api-application.docker/api/user
浏览器在发送相应的GET请求之前会自动发送这个preflight request。一旦启用,Play 的 CORS 支持将自动处理此 OPTIONS 路由。
【讨论】:
这确实工作得很好。万分感谢。我的过滤器也在我的 application.conf 中链接到的非标准路径中。但是根据您的建议重构所有内容后,它确实像一个魅力。以上是关于选项请求失败并出现 404的主要内容,如果未能解决你的问题,请参考以下文章
来自基于 OWIN 的 WebAPI 的飞行前选项 CORS 令牌请求出现 400 错误
MockMvc GET 请求失败,出现 404 但 URL 有效