这个标题听上去有点邪恶,但事实并非如此。
我家里有几个 IP 网络摄像头。它们都能够以多部分 jpeg 流的形式提供动态图像。例如,如果我去,http://frontdoor-cam/videostream.cgi
我会得到一个显示我家前廊的多部分 jpeg。
目前所有这些摄像头都使用 HTTP Basic 身份验证。没有选项可以关闭它。
我希望有一个网页,可以让我查看所有这些摄像头,而无需输入n用户 ID/密码组合。我曾尝试使用类似 URL 嵌入图像,http://userid:password@frontdoor-cam/videostream.cgi
但 Chrome(显然还有其他浏览器)显然出于“安全原因”而取消了对这种 URL 样式的支持。(我认为这与网络钓鱼攻击有关。)
因此,我想要做的是让一些软件在我的 Linux 机器上运行,充当中介。 的请求http://mylinuxbox/whatever/frontdoor.foo
将执行对 的请求http://frontdoor-cam/videostream.cgi
,传入凭证(我只需将其包含在其配置中)并流回响应(流式传输很重要,因为会源源不断地发送 jpeg 图像流)。
我希望已经存在可以相当轻松地完成此操作的软件。该软件可以是在其自己的端口上运行的独立软件,也可以是 Apache 模块。(我的机器上已经运行了 Apache 2.2。)
答案1
您需要的是在 Linux 机器上运行反向代理。然后,您可以使用语法向代理发出访问摄像头的请求http://username:password@domain/
。大多数 Web 服务器软件都可以设置为反向代理。
- Apache 使用mod_proxy
- Nginx 具有HttpProxy模块
- lighttpd 有mod_proxy
答案2
这是对 heavyd 答案的详细说明,而不是其他内容。根据他的回答,我最终在 Apache 配置中执行了以下操作:
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
...
<Proxy *>
Allow from all
</Proxy>
ProxyPassMatch ^/cams/noauth/([-a-z]*)/(.*)$ http://$1-cam/$2
<LocationMatch "/cams/noauth/">
RequestHeader set Authorization "Basic dXNlcmlkOnBhc3N3ZA=="
</LocationMatch>
这样一来,任何到的请求http://mylinuxbox/cams/noauth/LOCATION/WHATEVER
都会反向代理到http://LOCATION-cam/WHATEVER
,并且会发送适当的授权标头。
在此期间我发现了一个警告:浏览器通常对它们向单个主机发送的并发请求数量有限制。Chrome 的限制恰好是 6。Firefox 有类似的默认限制,但可以在 about:config 中调整。由于所有摄像头似乎都来自单个主机,并且它们通过保持连接打开来“流式传输”,因此单个页面上只有前几个摄像头会显示,其余图像将被阻止,等待其他摄像头完成(这永远不会发生)。
一种可能的解决方法是使用虚拟主机、子域或甚至额外的端口,使单个服务器看起来像多个服务器。