【问题标题】:Easy reverse proxy for serving images over ssl通过 ssl 提供图像的简单反向代理
【发布时间】:2016-07-22 18:03:49
【问题描述】:

我创建了一个简单的基于 Web 的电子邮件客户端,例如 gmail。我想显示图像,但为了在我的 ssl 网站上执行此操作,我需要通过 ssl 提供的所有图像(否则我会收到“混合内容”警告)。所以我需要一个像 gmail 这样的反向代理来提供这些图像。

我将重写电子邮件中的所有图像 url 以指向反向代理。例如:

我的反向代理是https://myreverseproxy.com

原图网址http://stuff.com/image1.jpg

我会将网址改写为https://myreverseproxy.com?image-url=http://stuff.com/image1.jpg

当反向代理收到请求“https://myreverseproxy.com?image-url=http://stuff.com/image1.jpg”时,会从查询参数image-url(http://stuff.com/image1.jpg)中获取原图,获取图片,返回给https://myreverseproxy.com?image-url=http://stuff.com/image1.jpg的请求者。

是否有开箱即用的服务?我能写一个简单的吗?是否已经有任何库或解决方案可以安装在某个地方?

我对任何语言和任何平台都持开放态度...我只想解决这个问题。

【问题讨论】:

  • 仅供参考,您可以设置网络服务器,例如Apache 或 nginx 作为反向代理。如果您需要更大的灵活性,请使用 HAProxy。很容易找到所有这些的指南。将它们与您的应用程序分开运行,并添加会话/令牌身份验证以确保安全。
  • 附带说明 - 您可能会考虑将图像嵌入电子邮件而不是使用图像服务器,大多数电子邮件客户端(如果不是全部)默认情况下会阻止图像链接,除非收据白名单发件人。此外,如果将电子邮件发送给外部各方,如果他们多次阅读电子邮件,这种方法将节省您的带宽成本。
  • 谢谢@Hang。这仅适用于传入的电子邮件(来自我的系统之外)。当我们发送电子邮件时,我们会将图像 url 交换回它们的原始地址,这样外面的人就不会访问我们的反向代理了。事实上,我们将通过 IP 锁定它。

标签: https gmail reverse-proxy mixed-content


【解决方案1】:

我会建议与 Tudor 相同的东西:用节点编写的代理。

但是,我建议使用更广泛使用和测试的库,例如 node-http-proxy。它真的设置简单,只需不到 20 行代码即可满足您的需求。

var httpProxy = require('http-proxy')

httpProxy.createServer({
  target: {
    host: 'stuff.com',
    port: 80
  },
  ssl: {
    key: fs.readFileSync('./ssl-key.pem', 'utf8'),
    cert: fs.readFileSync('./ssl-cert.pem', 'utf8')
  }
}).listen(443);

如果客户端随后访问https://reverseproxy.com/image.png,则流程如下

我假设在此架构中,反向代理在与提供图像的网络服务器不同的服务器上运行,但不一定是这种情况。如果它们都在同一台服务器上运行,只需在 target 部分中使用 host: 'localhost'

--

以防万一您不熟悉 Node,为了快速运行此设置,您需要执行以下操作。

  • 安装节点
  • 创建一个包含 yourprojectpath/index.js 中代码的新文件
  • 通过在项目目录中运行 npm init 来生成 package.json 文件
  • 运行npm install --save http-proxy 安装http-proxy 库并能够在代码中使用它

您现在应该可以通过运行来运行反向代理了

node index.js

如果您打算在生产中使用它,我强烈建议您查看PM2。它是 node 的进程管理器,它基本上确保您的应用程序始终运行,无论如何。特别是,如果应用程序抛出任何类型的异常并导致它终止,它将重新启动它。

安装:

npm install -g pm2

用法:

pm2 start index.js

还有一些注意事项:

  • 确保您的.pem 文件具有适当的权限和所有者。 chmod 400 通常是一个不错的选择(只有所有者才能阅读)。不过,运行 Node 应用程序的用户应该能够阅读它们。
  • 如果您的服务器在(软件或硬件)防火墙后面运行,您可能需要打开端口 443 以接收传入流量
  • 根据您的 SSL 证书提供商,您可能需要将它提供给您的文件转换为 PEM 格式
  • 如果需要,node-http-proxy 支持additional options,例如在代理请求时添加标头
  • 我上面介绍的脚本假设您在同一目录中拥有ssl-key.pemssl-cert.pem

希望对您有所帮助!只要问你是否有不清楚的地方

【讨论】:

  • 谢谢! “我假设在这个模式中,反向代理在不同的服务器上运行,作为提供图像的网络服务器”是的,就是这样。事实上,这些图像将来自整个网络。我正在使用反向代理通过 https 检索 http 托管图像,这样我的网络电子邮件客户端就不会抱怨混合内容(请参阅我的问题)。这还能用吗?
  • 我打算在 azure 中托管这个...有什么问题或我应该注意的事情吗?
【解决方案2】:

如果您没有自签名证书,以下是创建自签名证书的方法

Nodejitsu docs

现在是用 node.js 编写的代码:

HTTPS proxy

...还有截图:)

【讨论】:

  • 谢谢!我们已经购买了证书,并且该子域还需要一个。那么该代码是用节点编写的https代理吗?哇...我去看看!
【解决方案3】:

使用 nginx 可以轻松完成。顺便说一句,它可以按照您的要求完成,也可以使 url 与原始 url 完全相同。例如 cdn.xxx.com/img.jpg - www.xxx.com/img.jpg。

【讨论】:

    【解决方案4】:

    Richard,您可以通过在 nginx 配置文件中启用 CORS 轻松解决混合内容的问题,这里是一个示例 http://enable-cors.org/server_nginx.html。在这里它允许所有人使用cors,您可以设置特定的域或ip,您需要查看更多详细信息。

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 2017-08-01
      • 1970-01-01
      • 2019-07-21
      • 2017-09-19
      • 2019-05-12
      • 2016-11-17
      • 1970-01-01
      • 2015-11-15
      相关资源
      最近更新 更多