选项请求失败并出现 404

Posted

技术标签:

【中文标题】选项请求失败并出现 404【英文标题】:Option request fails with 404 【发布时间】:2018-10-17 05:35:48 【问题描述】:

我正在尝试将 GET 请求从我的前端发送到 API 应用程序。两者都在我的本地机器上运行。这就是它现在的构建方式:

backend <===> frontend <=x=> API application

这三个部分在各自的 docker 容器中相互独立运行,并且仅通过 HTTP 请求相互通信。

如上图所示,backendfrontend 之间的连接工作正常,但 frontendAPI 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 有效

我的 IIS 提示 HTTP 错误 404 - 文件或目录未找到。

SQL2005 请求失败或服务未及时响应

Eclipse启动Tomcat失败,404错误。

404 for web.api cors 选项