6

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

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

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

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

我将 url 重写为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的请求者。

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

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

4

4 回答 4

10

我会建议与 Tudor 相同的东西:用 node.js 编写的代理。

但是,我建议使用更广泛使用和测试的库,例如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,则该过程将如下所示

在此处输入图像描述

我假设在此模式中,反向代理在与提供图像的网络服务器不同的服务器上运行,但事实并非如此。如果它们都在同一台服务器上运行,只需host: 'localhost'在该target部分中使用。

--

万一您不熟悉 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 支持其他选项,例如在代理请求时添加标头
  • 我上面介绍的脚本假设你有ssl-key.pem并且ssl-cert.pem在同一个目录中

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

于 2016-04-09T21:47:02.563 回答
2

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

Nodejitsu 文档

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

HTTPS 代理

...和截图:)

截屏

于 2016-04-08T21:35:53.407 回答
0

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

于 2016-04-14T19:23:11.493 回答
-1

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

于 2016-04-15T06:34:56.793 回答