通过ssl提供图像的简易反向代理

时间:2016-04-03 04:28:13

标签: https gmail reverse-proxy mixed-content

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

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

我的反向代理是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)获取原始图像,获取图像,并将其返回给{的请求者{3}}

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

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

4 个答案:

答案 0 :(得分:10)

我建议像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 ,则流程如下:

enter image description here

我假设在这个模式中,反向代理在不同的服务器上运行,作为服务于图像的Web服务器,但不一定是这种情况。如果它们都在同一台服务器上运行,只需在host: 'localhost'部分使用target

-

如果您不熟悉Node,请按以下步骤快速运行此设置。

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

您现在应该可以通过运行

来运行反向代理
node index.js

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

安装:

npm install -g pm2

用法:

pm2 start index.js

还有一些说明:

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

希望有所帮助!并且问一下你看起来不清楚的事情

答案 1 :(得分:2)

如果您没有

,请点击此处了解如何创建自签名证书

Nodejitsu docs

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

HTTPS proxy

...和截图:)

screenshot

答案 2 :(得分:0)

使用nginx可以轻松完成。顺便说一句,它可以像你问的那样完成,也可以使url与原始url完全相同。例如cdn.xxx.com/img.jpg - www.xxx.com/img.jpg。

答案 3 :(得分:0)

Richard,您可以通过在nginx配置文件中启用CORS轻松解决混合内容的问题,这是一个示例http://enable-cors.org/server_nginx.html。在这种情况下,每个人都可以使用,你可以设置特定的域名或IP,你需要查看更多细节。