用于通过 ssl 提供图像的简单反向代理

Easy reverse proxy for serving images over ssl

我创建了一个简单的基于 Web 的电子邮件客户端,例如 gmail。我想显示图像,但为了在我的 ssl 站点上显示图像,我需要通过 ssl 提供所有图像(否则我会收到 "mixed-content" 警告)。所以我需要一个像 gmail 一样的反向代理来提供这些图像。

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

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

原图urlhttp://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)中获取原始图片,获取图片,并return 它给 https://myreverseproxy.com?image-url=http://stuff.com/image1.jpg 的请求者。

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

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

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

Nodejitsu docs

现在是代码,写在node.js:

HTTPS proxy

...和截图 :)

我会推荐与 Tudor 相同的东西:用 node 编写的代理。

但是,我建议使用更广泛使用和测试的库,例如 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
  • 中代码的新文件
  • 通过 运行ning npm init 在项目目录中生成一个 package.json 文件
  • 运行 npm install --save http-proxy 安装 http-proxy 库并能够在代码中使用它

您现在应该可以通过 运行ning

运行 反向代理
node index.js

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

安装:

npm install -g pm2

用法:

pm2 start index.js

更多注意事项:

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

希望对您有所帮助!如果你觉得不清楚就问问

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

Richard,您可以通过在 nginx 配置文件中启用 CORS 轻松解决混合内容的问题,这里是一个示例 http://enable-cors.org/server_nginx.html。里面是allowing cors给大家,可以针对特定的域或ip进行设置,具体需要查看。