谷歌云函数替换 url 中的双斜杠

Posted

技术标签:

【中文标题】谷歌云函数替换 url 中的双斜杠【英文标题】:Google cloud functions replaces double slash in url 【发布时间】:2019-11-21 11:58:30 【问题描述】:

我正在尝试在 Google Cloud Functions 上部署 cors-anywhere。我应该在 gcp 的链接之后提供 url。

看起来像这样:

https://us-central1-my-project.cloudfunctions.net/my-function/http://dummy.restapiexample.com/api/v1/employees

但它已转换为:

https://us-central1-my-project.cloudfunctions.net/my-function/http:/dummy.restapiexample.com/api/v1/employees

主机后面的所有双斜杠都转换为简单的。

我尝试替换 req.url 以将 http:/ 转换为 http://,但仍然无法正常工作。也许这需要在网络服务器级别进行修复。

这是我在 GCP 中的函数

var cors_proxy = require('cors-anywhere').createServer(
  requireHeader: ['origin', 'x-requested-with'],
  removeHeaders: [
    'cookie',
    'cookie2',
  ],
  // See README.md for other options
);

exports.myFunction = (req, res) => 
  req.url = req.url.replace('/my-function/', '/'); // Strip '/my-function' from the front of the URL, else the proxy won't work.

  return cors_proxy.emit('request', req, res);
;

有人尝试在无服务器功能中部署它吗?

【问题讨论】:

这不是合法的 URL。当您需要将 URL 添加为查询参数时,请查看 URL Encoding。 只需使用 https://us-central1-my-project.cloudfunctions.net/my-function/dummy.restapiexample.com/api/v1/employees 作为 URL。正如您在问题中链接到的github.com/Rob--W/cors-anywhere 的自述文件所述,“代理 URI 的协议部分是可选的,默认为“http”。如果指定了端口 443,则协议默认为“https”。” 因此,如果您想代理 https://dummy.restapiexample.com/api/v1/employees (https),​​则应使用 URL https://us-central1-my-project.cloudfunctions.net/my-function/dummy.restapiexample.com/api/v1/employees:443 【参考方案1】:

您正在使用 req.url,其中包含请求 URL 的规范化版本。您需要使用req.originalUrl,顾名思义,它保留了原始请求的 URL。请参阅Express docs 了解更多信息。

【讨论】:

以上是关于谷歌云函数替换 url 中的双斜杠的主要内容,如果未能解决你的问题,请参考以下文章

谷歌云存储 CNAME URL 重定向

谷歌云构建不使用环境变量替换 Firebase 令牌

如何从谷歌云存储中读取子目录/前缀中的文件?

通过谷歌云功能在 DataFlow 作业中的 GCS .csv

谷歌云在使用 PostMan 时签署了 url “SignatureDoesNotMatch”,但在 Python 中运行良好

在谷歌云存储中使用带有签名 URL 的版本控制