修改nginx反向代理返回的HTML页面

修改nginx反向代理返回的HTML页面

我设置了一个反向代理,用于从互联网访问位于内部网中的第三方应用程序。假设此应用程序位于以下 URL 上:

https://internalserver:8080/(仅可从内联网访问)

并且代理已打开:

https://proxyserver/(从世界任何地方都可到达)

代理由 nginx 管理,运行正常。当用户访问时,https://proxyserver/ 他们会获取 处的应用程序内容https://internalserver:8080/

问题在于应用程序在 HTML 响应中写入了绝对 URL,因此,当用户单击新页面的链接时,浏览器会尝试使用其内部名称来定位页面,例如而 https://internalserver:8080/somepage 不是 https://proxyserver/somepage

我知道这是一个程序错误,但我无法修改该程序。

我可以使用 nginx 拦截响应、修改 URL 并将其(修改后的)发送到最终客户端吗?或者可以使用其他工具?

编辑:我看见这个问题之前有过,但我的情况更具体,引用的问题要求进行通用修改。在这种情况下,fast-cgi 临时程序是最佳解决方案,我想要的是针对(我认为)更常见场景的更具体的解决方案。虽然 fast-cgi 程序可以工作,但我正在寻找一种最简单、可能更强大且经过现实世界验证的解决方案。

答案1

这是 YouTube 上的官方 Nginx 视频,演示了内联内容重写。

https://youtu.be/7Y7ORypoHhE?t=20m22s

确实使用 sub_filter

http://nginx.org/en/docs/http/ngx_http_sub_module.html

就你的情况而言,你正在查看类似以下内容的内容:

location / {
sub_filter_once off;
sub_filter_types text/html;
sub_filter "https://internalserver:8080" "https://proxyserver";
}

答案2

http://nginx.org/en/docs/http/ngx_http_sub_module.html

ngx_http_sub_module 模块是一个过滤器,它通过将一个指定的字符串替换为另一个指定的字符串来修改响应。

该模块不是默认构建的,需要使用--with-http_sub_module配置参数来启用。

示例配置

sub_filter      </head>
    '</head><script language="javascript" src="$script"></script>';

相关内容