我使用 Apache 2.4 反向代理来远程访问我的网络摄像头。反向代理运行良好。
- 外部 URL:
http://example.com/camera1/home.asp
- 内部 URL:
http://camera1/home.asp
但是,一些以/
“来自站点根目录的绝对 URI 而不是相对 URI”开头的链接无法被反向代理正确重写。
而不是像这样重写:
http://example.com/camera1/script.js
它们被重写如下:
http://example.com/script.js
这导致应用程序无法正常工作。这仅仅是因为 Apache 无法识别我正在使用的链接mod_proxy
, mod_proxy_http
, mod_proxy_html
。
HTML、CSS提供的链接自动重写mod_proxy_html
在此上下文中无法工作,因为丢失的链接位于最小化的 JavaScript 中(压缩后没有空格也没有缩进)
不用说我无法修改我的网络摄像头的软件。
但是,如果我知道在将答复发送回客户端之前如何引入要应用的正则表达式,我已经确定了可以应用来进行更正的模式。
有没有什么办法可以对申请答案进行一些后期处理?
我的配置如下:
ProxyRequests Off
ProxyPass /cam1/ http://cam1/
ProxyPassReverse /cam1/ http://cam1/
<Location /cam1/>
ProxyHTMLEnable On
ProxyHTMLExtended On
ProxyHTMLURLMap /cgi/ /cam1/cgi/
ProxyHTMLURLMap /advanced_data.asp /cam1/advanced_data.asp
</Location>
在大多数情况下,它都能正常工作,响应得到正确处理,我可以看到/cam1
添加了哪些内容。但有些脚本不起作用。
答案1
我需要一种方法来在响应流中用一个正则表达式替换另一个正则表达式。我在那里找到了我需要的一切:
mod_sed
这需要将mod_sed
模块添加到 Apache 配置中。
LoadModule sed_module modules/mod_sed.so
这样我就可以sed
对响应流应用命令。
我将这些行添加到我的原始配置中:
AddOutputFilter Sed js OutputSed "s/\"\/cgi\//\"\/cam1\/cgi\//g"
因此,指令未自动更正的行ProxyHTMLURLMap
将由 sed 指令更正。
最终得到:
ProxyPass /cam1/ http://cam1/ ProxyPassReverse /cam1/ http://cam1/ <Location /cam1/> ProxyHTMLEnable On ProxyHTMLExtended On ProxyHTMLURLMap /cgi/ /cam1/cgi/ ProxyHTMLURLMap /advanced_data.asp /cam1/advanced_data.asp AddOutputFilter Sed js OutputSed "s/\"\/cgi\//\"\/cam1\/cgi\//g" </Location>