短篇故事
尔加! 我希望做过pipe理界面的开发者会暴露一个“webroot = / myAppAppearsHere”选项,或者使所有的链接都是相对的。
很长的故事
我有一个pipe理门户网站的客户,基本上是一个Apache的mod_authlogin,然后一系列链接到后端pipe理页面就像这样;
https://portal.mysite.com/login https://portal.mysite.com/
然后像这样的一堆链接
https://portal.mysite.com/monitoring -> https://nagios.localdomain/nagios https://portal.mysite.com/munin -> https://munin.localdomain/nagios https://portal.mysite.com/bacukups -> https://backups.localdomain/backups
然而有几个应用程序真的不满意被反向代理到一个子目录,例如chef-server-webui和logstash web界面。
ProxyPassReverse将重新映射头,但所有内部的绝对URL需要被改变,如果在应用configuration中没有这个选项,那么这个必须被强制到HTML响应中。
明显的策略是创build子域或通配符子域来映射到这样的应用程序,
https://chef.mysite.com/ -> https://chefserver.localdomain:4040/ https://logstash.mysite.com/ -> https://logstash.localdomain/ https://*.mysite.com/ -> https://($1).localdomain/
但不幸的是,我不能控制域名的pipe理,获得这些添加是可能的,但是一个痛苦。 (但我更喜欢一个解决scheme,不需要第三方参与每个新的链接)(我知道一个通配符会解决这个问题,但我有兴趣看到基于HTTP和Apache的替代scheme。 ..为了学习等;-)
所以我已经转向使用类似于mod_proxy_html的Apache2 :: ModProxyPerlHtml ,并允许在文档中dynamic重新映射string。 这实际上确实与LocationMatch和ProxyHTMLRewrite的一些组合工作,我甚至可以让JavaScript发挥很好。 然而,每个人做一个巨大的痛苦,特别是对于任何非web 1.0应用程序。
例如,下面几乎可以修复logstash在/ logstash下正常工作;
<LocationMatch "^/logstash/"> RequestHeader unset Accept-Encoding PerlSetVar ProxyHTMLVerbose "On" PerlInputFilterHandler Apache2::ModProxyPerlHtml PerlOutputFilterHandler Apache2::ModProxyPerlHtml SetHandler perl-script PerlAddVar ProxyHTMLRewrite "/style.css /logstash/style.css" PerlAddVar ProxyHTMLRewrite "/css/smoothness/jquery-ui-1.8.5.custom.css /logstash/css/smoothness/jquery-ui-1.8.5.custom.css" PerlAddVar ProxyHTMLRewrite "/js/jquery-1.6.1.min.js /logstash/js/jquery-1.6.1.min.js" PerlAddVar ProxyHTMLRewrite "action='/search' action='/logstash/search'" PerlAddVar ProxyHTMLRewrite "/js/jquery-ui-1.8.13.min.js /logstash/js/jquery-ui-1.8.13.min.js" PerlAddVar ProxyHTMLRewrite "/media/throbber.gif /logstash/media/throbber.gif" PerlAddVar ProxyHTMLRewrite "/api/search /logstash/api/search" PerlAddVar ProxyHTMLRewrite "/api/histogram /logstash/api/histogram" </LocationMatch>
但是,它的命中率和错过,你不能只是通配符的URL交换,因为有大量的JSON和JavaScript被打乱。
我正在考虑跟踪当前代理后端的某种cookie或querystring var,所以apache可以dynamic地将请求redirect到正确的后端。
https://admin.mysite.com/?request-proxy=chef -> https://chefserver.localdomain:4040/ https://admin.mysite.com/?request-proxy=logstash -> https://logstash.localdomain/
基本上,当apache最后查看所有服务器的HTTP内容时,它可以通过额外的查询variables&request-proxy = logstashdynamic地标记url。 不过,我认为这将遭受与ModProxyPerlHtml / mod_proxy_html解决scheme相同的问题,因为它永远不会在任何地方工作,特别是在应用程序中,一些JavaScript用于QUERY PARMS客户端。
我猜一个cookies几乎可以工作,因为你可以基于一些传递的cookie值代理,如“请求代理= logstash”,但是如果你有2个标签打开到网站,这可能会遇到问题,因为他们可能会写在每个其他cookies。
我知道有些应用程序只是采取某种暴力手段,将整个代理请求包装在Netscreen SA-3000等重新发布的html中。
无论如何,有没有实现这些策略的任何apache模块,或者不知何故,为每个代理网站编写匹配规则。
mod_substitute做得非常好;
简介:mod_substitute提供了一种机制来对响应体执行正则expression式和固定stringreplace。
通过映射规则只需要一点时间。