从 WebSeal 到 Apache Web 服务器的请求 Header(主机属性)lost/Reset
Request Header (Host attribute) lost/Reset from WebSeal to Apache web server
URL (https://xyz.abc.com/cc) 当负载均衡器看到 /cc 时,它会将请求转发到 WebSeal(反向代理服务器)。
WebSeal add/set(Header 主机:xyz.abc.com)并将请求转发到 Apache2(Web 服务器)。在 Web Seal 中,我们有标准连接 (/cc),它将处理来自 LB 的请求。
当请求到达 Apache2 时,它丢失 HOST header 值 (xyz.abc.com) 并将其重置为 Apache2 服务器名称 (xyzapacheweb1)
现在终于请求从 apache2 传递到 Liferay Portal (6.2),它显示 URL (xyzapacheweb1) 而不是 (xyz.abc.com)
Liferay 在 Web 服务器前端时需要主机名,因此我们必须硬编码 URL(在 属性 文件或 apache2 中)
我们要删除 Hard-Code 值并传递动态主机名,以便我们可以为单个应用程序使用多个 URL。
注意:当我们在图片中没有 WebSeal 时,它会保留 HOST 名称。即 Apache2 显示实际域名 (xyz.abc.com)
你能帮我解决这个问题吗?
如果您需要更多信息,请告诉我。
如果您使用 mod_proxy 从 apache 转发到 tomcat,则您缺少选项
ProxyPreserveHost 开启
这是因为通过http转发。如果您使用的是 ajp,协议会自动为您处理。
虽然我不确定 webseal 的等效选项,也许 apache 可以帮助您找到它
我想到了两个解决方案。
临时:
- 在来自 WebSeal 的请求中设置自定义 header 属性,即 domain-host-name。从 LB -> WebSeal 将主机值设置为此变量。
- Apache 网络服务器能够检索此值,因为它不是默认请求 header。基于 domain-host-name 值从 Apache 网络服务器为 Liferay 设置 Header HOST 值。
删除web.server.host.name 属性在Liferay中它会自动获取HOST值(由Apache设置)。
如果 domain-host-name 设置为 xyz.abc.com
,则设置 xyz.abc.com
SetEnvIf domain-host xyz.abc.com HAVE_MyRequestHeader
请求Header 设置主机xyz.abc.com env=HAVE_MyRequestHeader
如果 domain-host-name 设置为 abc.xyz.com
,则设置 abc.xyz.com
SetEnvIf domain-host abc.xyz.com HAVE_MyRequestHeader_1
请求Header 设置主机abc.xyz.com env=HAVE_MyRequestHeader_1
这是一个临时解决方案,因为我们必须在 Apache 中硬编码主机名检查。所以如果有新的 URL 那么你必须在 Apache 中配置它。
永久:
- WebSeal 有虚拟连接的概念。可以将 webseal 配置为扮演虚拟主机角色。
如果您遇到类似类型的问题,请告诉我,我可以帮助解决。
URL (https://xyz.abc.com/cc) 当负载均衡器看到 /cc 时,它会将请求转发到 WebSeal(反向代理服务器)。
WebSeal add/set(Header 主机:xyz.abc.com)并将请求转发到 Apache2(Web 服务器)。在 Web Seal 中,我们有标准连接 (/cc),它将处理来自 LB 的请求。
当请求到达 Apache2 时,它丢失 HOST header 值 (xyz.abc.com) 并将其重置为 Apache2 服务器名称 (xyzapacheweb1)
现在终于请求从 apache2 传递到 Liferay Portal (6.2),它显示 URL (xyzapacheweb1) 而不是 (xyz.abc.com)
Liferay 在 Web 服务器前端时需要主机名,因此我们必须硬编码 URL(在 属性 文件或 apache2 中)
我们要删除 Hard-Code 值并传递动态主机名,以便我们可以为单个应用程序使用多个 URL。
注意:当我们在图片中没有 WebSeal 时,它会保留 HOST 名称。即 Apache2 显示实际域名 (xyz.abc.com)
你能帮我解决这个问题吗?
如果您需要更多信息,请告诉我。
如果您使用 mod_proxy 从 apache 转发到 tomcat,则您缺少选项
ProxyPreserveHost 开启
这是因为通过http转发。如果您使用的是 ajp,协议会自动为您处理。
虽然我不确定 webseal 的等效选项,也许 apache 可以帮助您找到它
我想到了两个解决方案。
临时:
- 在来自 WebSeal 的请求中设置自定义 header 属性,即 domain-host-name。从 LB -> WebSeal 将主机值设置为此变量。
- Apache 网络服务器能够检索此值,因为它不是默认请求 header。基于 domain-host-name 值从 Apache 网络服务器为 Liferay 设置 Header HOST 值。
删除web.server.host.name 属性在Liferay中它会自动获取HOST值(由Apache设置)。
如果 domain-host-name 设置为 xyz.abc.com
,则设置 xyz.abc.comSetEnvIf domain-host xyz.abc.com HAVE_MyRequestHeader 请求Header 设置主机xyz.abc.com env=HAVE_MyRequestHeader
如果 domain-host-name 设置为 abc.xyz.com
,则设置 abc.xyz.comSetEnvIf domain-host abc.xyz.com HAVE_MyRequestHeader_1 请求Header 设置主机abc.xyz.com env=HAVE_MyRequestHeader_1
这是一个临时解决方案,因为我们必须在 Apache 中硬编码主机名检查。所以如果有新的 URL 那么你必须在 Apache 中配置它。
永久:
- WebSeal 有虚拟连接的概念。可以将 webseal 配置为扮演虚拟主机角色。
如果您遇到类似类型的问题,请告诉我,我可以帮助解决。