用于通过 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 的请求者。
是否有开箱即用的服务?我可以写一个简单的吗?是否已经有任何我可以安装在某个地方的库或解决方案?
我对任何语言和任何平台都持开放态度...我只想解决这个问题。
以下是创建自签名证书的方法(如果您没有)
现在是代码,写在node.js:
...和截图 :)
我会推荐与 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.pem
和 ssl-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进行设置,具体需要查看。
我创建了一个简单的基于 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 的请求者。
是否有开箱即用的服务?我可以写一个简单的吗?是否已经有任何我可以安装在某个地方的库或解决方案?
我对任何语言和任何平台都持开放态度...我只想解决这个问题。
以下是创建自签名证书的方法(如果您没有)
现在是代码,写在node.js:
...和截图 :)
我会推荐与 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.pem
和ssl-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进行设置,具体需要查看。