我有一个三层的多层应用程序,比如说公共、业务和工作区(都运行 apache)。客户端请求到达公共服务器,请求被处理并分派到执行“操作”的业务服务器,响应返回到公共服务器,然后公共服务器处理响应并将其传递给客户端。我有一个场景,其中我想要一个请求说 /rstudio 来到公共服务器,该服务器被分派到业务上,实习生反向代理到工作区服务器。这里有两个问题:
- 工作区服务器因请求而异
- 在工作空间服务器 (Rstudio) 上运行的应用程序使用 GWT 并在根 url 上引用资源(静态资源 js、css 等和 RPC coms)。所有应用程序内重定向也发生在域上。
从业务服务器,我已经从我的应用程序服务器设置了到 Rstudio 服务器的反向代理。
<Proxy *>
Allow from localhost
</Proxy>
ProxyPass /rstudio/ http://business_server/
ProxyPassReverse /rstudio/ http://business_server/
RedirectMatch permanent ^/rstudio$ /rstudio/
并且这项工作正常(参考https://support.rstudio.com/hc/en-us/articles/200552326-Running-with-a-Proxy)。为了处理动态工作区服务器,我可以执行以下操作,但 ProxyPassReverse 不支持值表达式,这种方法并不令人愉快。
ProxyPassMatch ^/rstudio/(.*)$ http://$1
ProxyPassReverse ^/rstudio/(.*)$ http://$1
RedirectMatch permanent ^/rstudio$ /rstudio/
我已经尝试使用 mod_rewrite 规则(以下)相同但没有 ProxyPassReverse 并且由于 GWT Rstudio 上的域重定向,这不起作用。添加 ProxyPassReverse 可以解决问题,但我发现值部分没有表达式来处理动态工作区服务器问题。
RewriteRule "^/rstudio/(.*)" "http://$1" [P]
以下是使用 LocationMatch 和 mod_headers 解决此问题的第三种方法:
<LocationMatch ^/rstudio/(.+)>
ProxyPassMatch http://$1
Header edit Location ^http:// "http://%{SERVER_NAME}e/rstudio/"
</LocationMatch>
但这也不是一件好事,因为 header 指令的值没有针对环境变量进行评估(并且只有反向引用在这里起作用)。尽管如果我对business_server进行了编码,我可以使反向代理工作正常工作,即:
<LocationMatch ^/rstudio/(.+)>
ProxyPassMatch http://$1
Header edit Location ^http:// "http://private_server/rstudio/"
</LocationMatch>
问题1:我想知道是否有更好的方法来解决这个问题,而无需在apache conf中对服务器DNS进行硬编码?
问题 2:使用硬编码服务器 DNS,反向代理对我有效(不完整但有效),但我遇到了根上资源引用的 GWT 问题,并且请求调度未完全正常工作。我进入登录页面,但找不到资源。
我想知道是否有更好的方法来处理它?
以下是来自浏览器的示例日志:
Navigated to https://public_server/rstudio
rworkspaces:43 GET https://public_server/rstudio.css
rworkspaces:108 GET https://public_server/js/encrypt.min.js
rworkspaces:167 GET https://public_server/images/rstudio.png 404 (Not Found)
rworkspaces:218 GET https://public_server/images/buttonLeft.png 404 (Not Found)
rworkspaces:218 GET https://public_server/images/buttonTile.png 404 (Not Found)
rworkspaces:218 GET https://public_server/images/buttonRight.png 404 (Not Found)