Apache 代理到 Glassfish - 如何抑制 URL 中的子文件夹?

Apache 代理到 Glassfish - 如何抑制 URL 中的子文件夹?

我有一台运行 Apache/2.2.24 的 Linux 服务器,同时运行 HTTP/HTTPS,还有一台监听端口 8080 的 Glassfish 3.1.2 服务器。

Glassfish 运行单个部署的应用程序,该应用程序包含用于单独网站的子文件夹,例如:

http://gfish:8080/rootSite
http://gfish:8080/rootSite/Site2
http://gfish:8080/rootSite/Site3
http://gfish:8080/rootSite/Site4

在 Apachevhosts.conf文件中,每个虚拟主机的 80 端口的所有流量都被重写为 443,如下所示:

RewriteEngine on
RewriteCond   %{SERVER_PORT}  !^443$
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://www.site2.com/rootSite/Site2$1 [L,R]

在 Apachessl.conf文件中,每个虚拟主机都配置为传递给 Glassfish,如下所示:

RedirectMatch ^/$ https://www.site2.com/rootSite/Site2$1
ProxyPass /rootSite/ http://gfish:8080/rootSite/
ProxyPassReverse /rootSite/ http://gfish:8080/rootSite/

对于 Web 用户来说,最终的结果是,当他们导航到时,http://www.site2.com他们会被重定向到 HTTPS 并代理到 Glassfish,从而看到:https://www.site2.com/rootSite/Site2

这是当前的工作配置。

期望结果是网络用户看不到子文件夹,并且看到的站点如下:https://www.site2.com

在现有配置下,实现此目标的最有效方法是什么?

编辑:

经过一番尝试,我发现 ssl.conf 文件中的某些配置是不必要的。我将其精简为以下内容:

ProxyRequests Off
<Proxy *>
  Order deny,allow
  Allow from all
</Proxy>
ProxyPass / http://gfish:8080/rootSite/Site2/
ProxyPassReverse / http://gfish:8080/rootSite/Site2/`

使用此新配置,我可以根据需要从 URL 中省略 /rootSite/Site2/然而所有 CSS 格式和图像都损坏了。

答案1

在 Apachevhosts.conf文件中,我将重写规则更改为:

RewriteRule ^(.*)$ https://www.site2.com$1 [L,R]

ssl.conf文件中我将其精简为:

ProxyRequests Off

ProxyPass /rootSite/ http://gfish:8080/rootSite/
ProxyPassReverse /rootSite/ http://gfish:8080/rootSite/

添加第一组代理语句是因为 Site2 依赖来自 rootSite 的 CSS 和图像文件来呈现页面。

ProxyPass / http://rootSite:8080/rootSite/Site2/
ProxyPassReverse / http://rootSite:8080/rootSite/Site2/

第二组代理语句将网站的外部根目录挂接到内部 Glassfish Site2 根目录。

此配置让我获得了外部用户看到的预期结果https://www.site2.com/

新问题

我将此配置交给开发人员进行测试,结果发现他们的代码中存在他们不愿意更改的绝对 URL。在这种情况下,主页有一个登录表单,表单操作指向绝对 URL,http://www.site2.com/rootSite/site2/login.xhtml 任何点击表单提交按钮的 Web 用户都会被重定向到该网站,这再次揭示了 URL 中不需要的子文件夹。

我一直在努力实现的解决方案是实施和配置mod_proxy_html

为此,我将必要的信息编译到 Apache 中以启用该模块,然后创建了一个proxy_html.conf包含以下内容的文件:

ProxyHTMLLinks a href
ProxyHTMLLinks area href
ProxyHTMLLinks link href
ProxyHTMLLinks img src longdesc usemap
ProxyHTMLLinks object classid codebase data usemap
ProxyHTMLLinks q cite
ProxyHTMLLinks blockquote cite
ProxyHTMLLinks ins cite
ProxyHTMLLinks del cite
ProxyHTMLLinks form action
ProxyHTMLLinks input src usemap
ProxyHTMLLinks head profile
ProxyHTMLLinks base href
ProxyHTMLLinks script src for

ProxyHTMLEvents onclick ondblclick onmousedown onmouseup \
onmouseover onmousemove onmouseout onkeypress \
onkeydown onkeyup onfocus onblur onload \
onunload onsubmit onreset onselect onchange

ssl.conf文件中我调整了代理配置如下:

ProxyPass /rootSite/ http://gfish:8080/rootSite/
ProxyPassReverse /rootSite/ http://gfish:8080/rootSite/

ProxyRequests Off
ProxyPass / http://gfish:8080/rootSite/Site2/
<Location />
ProxyPassReverse /
ProxyHTMLEnable On
ProxyHTMLURLMap http://gfish:8080/rootSite/Site2/ /
ProxyHTMLURLMap / /
</Location>

不幸的是,即使有了这个,我也没有达到重写表单操作链接的预期结果。

非常欢迎提出意见和见解。

相关内容