Firebase 托管应用引擎 URL 的 Access-Control-Allow-Origin

2023-12-29

我在 Firebase 托管上托管一个单页应用程序,我需要允许对应用程序引擎的跨域请求。应用程序托管在project-id.firebaseapp.com 上,应用程序引擎服务托管在project-id.appspot.com 上。我把部署文档 https://firebase.google.com/docs/hosting/full-config#section-full-firebasejson并且没有示例如何为 URL 添加 Access-Control-Allow-Origin 标头。

这是我的 firebase.json 的样子:

{
  "database": {
    "rules": "database.rules.json"
  },
  "hosting": {
    "public": "public",
    "redirects": [
      {
        "source": "/server/:rest*",
        "destination": "https://app-id.appspot.com/:rest*",
        "type": 301
      }
    ],
    "rewrites": [
      {
        "source": "/views/**",
        "destination": "/views/**"
      },
      {
        "source": "**",
        "destination": "/index.html"
      }
    ],
    "headers": [ {
      "source" : "https://app-id.appspot.com/registration/generate",
      "headers" : [ {
        "key" : "Access-Control-Allow-Origin",
        "value" : "*"
      } ]
    } ]
  }
}

我尝试使用 gsutils 设置 CORS,但它也没有帮助:

这是我的 cors.json

[
    {
        "maxAgeSeconds": 3600, 
        "method": ["GET", "POST"], 
        "origin": ["https://project-id.appspot.com/"]
    }
]

提前致谢

解决方案:

如果您只想在静态文件上允许 CORS,那么在 app.yaml 中设置 Access-Control-Allow-Origin 标头就足够了。对于动态请求,此标头不允许出现在 app.yaml 中,因此您必须以编程方式添加它。

如果您的请求很简单,则以下代码有效:

@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) 
    resp.addHeader("Access-Control-Allow-Origin", "*");
    resp.addHeader("Content-Type", "text/csv");
    resp.getWriter().append("Response");

}

但是,如果您的请求已预先处理,则必须重写 doOptions 方法并添加适当的标头:

@Override
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.addHeader("Access-Control-Allow-Origin", "*");
    resp.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
    resp.addHeader("Access-Control-Allow-Headers", "Content-Type");
}

@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    resp.addHeader("Access-Control-Allow-Origin", "*");
    resp.addHeader("Content-Type", "text/csv");
    resp.getWriter().append("Response");
}

Here https://www.html5rocks.com/static/images/cors_server_flowchart.png是一个有用的图表,它阐明了服务器上的 CORS 实现:


您的 firebase.json 不控制 appspot.com 文件,也不能用于修改应用引擎服务的标头。在这里,您尝试设置Access-Control-Allow-Origin on https://app-id.appspot.com/registration/generate。这是行不通的,因为这不是 Firebase Hosting 托管的页面。

相反,向 Firebase 页面添加标头的方法是将其放入 firebase.json 中,如下所示:

"headers": [ {
  "source" : "index.html",
  "headers" : [ {
    "key" : "Access-Control-Allow-Origin",
    "value" : "*"
  } ]
} ]

但这无助于解决 CORS 问题,因为它需要到位在返回的资源上 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Origin.

看起来你可以将它放入你的 app.yaml 下handlers基于this doc https://cloud.google.com/appengine/docs/go/config/appref.

handlers:
- url: /.*
  http_headers:
    Access-Control-Allow-Origin: http://mygame.appspot.com

另外,您可以通过编程方式添加它。正如enable-cors.org 上所解释的,以下是一些脚本实现:

对于 Google App Engine 中基于 Python 的应用程序,self.response.headers.add_header()可以使用方法,例如:

class CORSEnabledHandler(webapp.RequestHandler):
  def get(self):
    self.response.headers.add_header("Access-Control-Allow-Origin", "*")
    self.response.headers['Content-Type'] = 'text/csv'
    self.response.out.write(self.dump_csv())

对于基于 Java 的应用程序,请使用resp.addHeader():

public void doGet(HttpServletRequest req, HttpServletResponse resp) {
  resp.addHeader("Access-Control-Allow-Origin", "*");
  resp.addHeader("Content-Type", "text/csv");
  resp.getWriter().append(csvString);
}

对于基于 Go 的应用程序,请使用w.Header().Add():

func doGet(w http.ResponseWriter, r *http.Request) {
  w.Header().Add("Access-Control-Allow-Origin", "*")
  w.Header().Add("Content-Type", "text/csv")
  fmt.Fprintf(w, csvData)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase 托管应用引擎 URL 的 Access-Control-Allow-Origin 的相关文章

随机推荐

  • Python 在不需要时更改文件权限

    知道为什么下面的 Python 脚本在运行后将文件夹权限更改为只读吗 它运行一次并删除文件夹中的所有文件 但当它再次运行时 会出现 Windows 错误 5 访问被拒绝 因为脚本将文件夹的权限更改为只读 我看不出它的作用或如何避免它 谢谢
  • 如何获得 Go 中的终端大小?

    如何在 Go 中获取终端大小 在 C 语言中 它看起来像这样 struct ttysize ts ioctl 0 TIOCGWINSZ ts 但是如何在 Go 中访问 TIOCGWINSZ cgo编译器目前无法处理c函数中的变量参数和c头文
  • PyTorch Cuda 与 anaconda 不可用

    我正在使用 anaconda 来调节我的环境 对于一个项目 我必须使用 GPU 进行网络训练 我在我的项目中使用 pytorch 并且正在尝试让 CUDA 工作 我安装了cudatoolkit numba cudnn 不过 当我尝试这个命令
  • 如何使用 write() 或 fwrite() 将数据写入终端(stdout)?

    我正在尝试加快我的 C 程序的速度 以便更快地输出数据 目前我正在使用printf 向外界提供一些数据 它是连续的数据流 因此我无法使用 return data 我该如何使用write or fwrite 将数据提供给console而不是文
  • Laravel Eloquent - 随时加密/解密数据

    我可以用Crypt加密 解密我的数据 我想加密数据库中的一些信息 例如姓名 电子邮件 电话号码等 假设我希望对所有内容进行加密 我希望能够在后台自行执行此操作 我可以通过覆盖create and save功能 For instance th
  • 如何使用 Ruby 下载图片?

    我想使用 Ruby 下载这张图片 我怎么做 http farm1 static flickr com 92 218926700 ecedc5fef7 o jpg 我使用的是 Mac 操作系统 require open uri open yo
  • 不想在绘图轴上使用科学记数法

    我经常在 R 中使用以下函数绘制各种散点图plot命令 有时两个 有时仅其中一个绘图轴都用科学记数法标记 我不明白 R 何时决定切换到科学记数法 令人惊讶的是 它经常打印出任何理智的人在标记绘图时都不会用科学计数法书写的数字 例如它将 5
  • 如何共享我的 C/C++ 项目并隐藏部分源代码?

    我想将我的用 C C Linux 环境 gcc g 编译器 编写的项目作为共享库 静态库共享 而不实际共享源代码 这样其他用户就可以在不真正了解我的源代码的情况下使用我的项目 谁能告诉我如何将其共享为 so a 格式 假设 我的项目如下所示
  • 是否可以有一个远程sqlite数据库

    可以在服务器上远程存储 sqlite 数据库吗 我正在构建一个 iphone 应用程序 所有教程似乎都将 sqlite 数据库存储在 iphone 本身上 这是不可取的 因为您很快就会遇到并发问题 在这种情况下 我会使用传统的 RDMS 例
  • 有条件地从两个类中的任何一个继承[重复]

    这个问题在这里已经有答案了 可能的重复 在编译时动态生成结构 https stackoverflow com questions 11376149 generating structures dynamically at compile t
  • “记住我”身份验证功能是否总是意味着“不安全”网站?

    我正在考虑实施经典 记住我 复选框在我的网络应用程序上 允许经过身份验证的用户在返回访问我的网站后被 记住 Gmail http www gmail com Facebook http www facebook com其他人也有这种功能 但
  • Eigen Matrix 与 Numpy Array 乘法性能

    I read 在这个问题中 https stackoverflow com questions 10366054 c performance in eigen librar that eigen具有非常好的性能 但是 我尝试比较eigen
  • 类型化数据集的缺点是什么

    我来自一个喜欢构建自己的世界 而不是依赖他人构建的库和框架 逃离这个世界后 我发现了在 Visual Studio 中使用类型化数据集等工具的乐趣和轻松 那么除了失去灵活性之外 你还失去了什么 是否存在性能因素 忽略 procs 与动态 s
  • MVC 控制器操作参数为空

    我有控制器名称 District 和操作名称 Incharges 但我希望 URL 是这样的 带有一些参数的操作名称 www example com district incharges aaa www example com distri
  • Javascript无符号短到有符号短

    我有以下代码 var v 0xFF 0xFF alert v 0 lt lt 8 v 1 并警告 65535 最大空头值 如何将此字节数组视为有符号短整型 并获取该数组的有符号值 假设高位为符号 var sign v 0 1 lt lt 7
  • 如何自定义 JQPlot 周围的黑色边框

    如何在 JQPlot 中自定义图表周围的黑色边框 我广泛搜索了 CSS 文件 但没有找到任何内容 UPDATE 如果您不明白我的意思 请看这张图片 http img339 imageshack us img339 5796 jqplot p
  • 支持多种TLS协议的HttpClient

    我们正在编写一个必须使用 HTTPS 与一些服务器通信的应用程序 它需要与 AWS 使用 AWS 库 以及我们使用 TLS 1 2 的一些内部服务进行通信 我首先将 HttpClient 更改为使用 TLS 1 2 SSLContext p
  • 我对 PHP 会话的理解是否正确?

    我一直对会话内部如何工作很感兴趣 但我对 C 知之甚少 并且不确定在 PHP 源代码中哪里可以找到这一点 这是我目前对会话的理解 当您启动会话时 用户会被分配一个存储在 cookie 中的会话 ID 保存会话数据时 通过 SESSION 它
  • PHP 文件上传类型检查

    好的 这是我上传文件的代码 ext whitelist array pdf doc doc mkv mp4 mpg mpeg avi flv wma ogg if in array ext ext whitelist uniqid file
  • Firebase 托管应用引擎 URL 的 Access-Control-Allow-Origin

    我在 Firebase 托管上托管一个单页应用程序 我需要允许对应用程序引擎的跨域请求 应用程序托管在project id firebaseapp com 上 应用程序引擎服务托管在project id appspot com 上 我把部署