从 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 可以帮助您找到它

我想到了两个解决方案。

  1. 临时:

    • 在来自 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 中配置它。

  1. 永久:

    • WebSeal 有虚拟连接的概念。可以将 webseal 配置为扮演虚拟主机角色。

请参考:http://www-01.ibm.com/support/knowledgecenter/SSPREK_6.1.1/com.ibm.itame.doc_6.1.1/am611_webseal_admin642.htm%23vhost-scenario1?lang=en

如果您遇到类似类型的问题,请告诉我,我可以帮助解决。