Java 将子域从AWS ELB传递到应用程序服务器

Java 将子域从AWS ELB传递到应用程序服务器,java,tomcat,nginx,amazon-elb,Java,Tomcat,Nginx,Amazon Elb,我们有一个Java应用程序,提供多种产品。它的行为会根据产品的不同而变化 产品由url的子域定义: https://<product1>.example.com https://<product2>.example.com ... https://.example.com https://.example.com ... 每个URL都通过路由53映射到不同的AWS弹性负载平衡器,路由53将请求转发到我们的同类EC2应用服务器组 所以https://.example.c

我们有一个Java应用程序,提供多种产品。它的行为会根据产品的不同而变化

产品由url的子域定义:

https://<product1>.example.com
https://<product2>.example.com
...
https://.example.com
https://.example.com
...
每个URL都通过路由53映射到不同的AWS弹性负载平衡器,路由53将请求转发到我们的同类EC2应用服务器组

所以
https://.example.com
有一个ELB,
https://.example.com
具有不同的ELB。但是,这两个ELB都将流量定向到具有相同Java应用程序的同一组服务器

ELB根据端口9443和9001是否为https转发请求,nginx对端口9001上的所有流量进行重定向,否则将通过端口8080转发到Java应用程序

我需要能够在到达Java应用程序之前确定原始url是什么,以便可以使用它来确定响应的配置和行为。我想到的最好的方法是
$http\u referer
,但这只适用于初次访问后的任何请求,我们在第一次访问时也需要url

下面是一个(非常)粗略的部署图,我希望它能有所帮助。

事实证明,完整主机名确实会被推送到nginx层。修改nginx I的日志添加了
$host
,并显示了完整的主机名。我遇到的问题是tomcat丢失了主机数据,但这应该很容易解决

以下是我在
nginx.conf
中更新的内容:

log_format  main  '$host $remote_addr - $remote_user [$time_local]  "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
注意
$host
变量位于
main
之后的块的最前面

它应该在。。。这就是你要找的吗?此外,通配符或UCC(多SAN)SSL证书似乎会使所有这些额外的ELB变得多余。