【问题标题】:Google app engine prevent OPTIONS request between two services谷歌应用引擎阻止两个服务之间的 OPTIONS 请求
【发布时间】:2023-04-04 18:52:02
【问题描述】:

我创建了一个 GAE 项目并部署了两个服务:

  1. 前端应用默认 (https://myservice.appspot.com)
  2. 后端 (https://backend-dot-myservice.appspot.com) 用于后端 (Node.js)

我还添加了一个自定义域,以便在 https://myservice.com 也可以访问默认服务。

我遇到的问题是浏览器执行的每个 AJAX 请求之前都有一个 OPTIONS 请求(用于处理 CORS)。

避免此 OPTIONS 请求的最佳解决方案是什么?如果前端/后端都在同一台主机上,应该可以修复它,但我如何在 Google App Engine 上解决?

谢谢!

【问题讨论】:

  • CORS on App Engine 这样的东西对您有帮助吗?您有用于基于 Python、Java 和 Go 的应用程序的方法。这个SO case 可能会有所帮助。
  • 我已经应用了 CORS(否则,如果客户端和服务器位于不同的来源,它将无法工作),但是这样做浏览器正在对来自前端的所有请求执行飞行前 OPTIONS 请求 -端到端。这就是我想要阻止的,我知道的唯一方法是让客户端和服务器在同一个来源,这样就不再需要 CORS...

标签: google-app-engine cors options


【解决方案1】:

我解决了在默认服务上添加 dispatch.yaml 文件

dispatch:
- url: "*/api/*"
service: backend

后端是我的后端服务。 我更改了我的后端以监听 /api/something 之类的地址。

所以现在浏览器有源 https://myservice.com 并且 ajax 请求到后端的 url 就像 https://myservice.com/api/something。 由于现在客户端和服务器同源,不再需要 CORS 设置,浏览器也不再执行 OPTIONS 请求。

我不知道这是否是最好的解决方案,但对我来说它有效。

【讨论】:

    【解决方案2】:

    正如Stackoverflow post中提到的:

    OPTIONS 请求是跨域资源共享 (CORS) 中的飞行前请求

    此飞行前请求是由某些浏览器发出的,作为一种安全措施,以确保正在完成的请求受到服务器的信任。这意味着服务器知道在请求中发送的方法、来源和标头是安全的。

    当您尝试执行跨源请求时,您的服务器不应忽略这些请求,而是处理这些请求。


    CORS Support for Google App Engine in your app.yaml

    此功能的一个重要用途是支持跨域资源共享 (CORS),例如访问由另一个 App Engine 应用托管的文件。

    例如,您可以有一个游戏应用 mygame.appspot.com 访问由 myassets.appspot.com 托管的资产。但是,如果 mygame 尝试向 myassets 发出 JavaScript XMLHttpRequest,它将不会成功,除非 myassets 的处理程序返回包含值 http://mygame.appspot.com 的 Access-Control-Allow-Origin: 响应标头。

    handlers:
    - url: /images
      static_dir: static/images
      http_headers:
        Access-Control-Allow-Origin: http://mygame.appspot.com
    

    注意:如果您想允许所有人访问您的资产,您可以使用通配符“*”,而不是 http://mygame.appspot.com

    【讨论】:

    • 谢谢,但我想再次阻止 OPTIONS 请求,我知道阻止这些请求的唯一方法是让客户端和服务器位于同一来源,但我如何才能在GAE 的同源?
    • 你试过了吗? ajax 请求必须满足以下条件: 请求未设置自定义 HTTP 标头,如 'application/xml' 或 'application/json' 等。请求方法必须是 GET、HEAD 或 POST 之一。如果是 POST,内容类型应该是 application/x-www-form-urlencoded、multipart/form-data 或 text/plain 之一。更多信息here
    • Documentation 指出 Web 内容的来源是由用于访问它的 URL 的方案(协议)、主机(域)和端口定义的。只有当方案、主机和端口都匹配时,两个对象才具有相同的来源。某些操作仅限于同源内容,可以使用 CORS 解除此限制。请参阅链接以获取相同来源和不同来源的示例。
    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2023-03-30
    • 2011-01-30
    • 1970-01-01
    • 2012-03-22
    • 2017-04-10
    相关资源
    最近更新 更多