如何在不同的子域上提供多种Web应用程序?

时间:2018-11-01 15:01:10

标签: spring spring-boot

不确定标题是否合适,但目前我有三个应用程序(静态内容):

  • public
  • app
  • admin

public只是针对常规Web的内容,app是针对移动设备呈现的内容,admin基本上是用于管理内容的工具。 它们都包含在同一个Spring Boot应用程序中,并通过example.com/api与REST API进行通信。从技术上讲,我可以将它们放入resources/static中,这样

resources/static/public
resources/static/admin
resources/static/app

这将允许我这样访问应用程序:

example.com/public/index.html
example.com/admin/index.html
example.com/app/index.html

但是,我的目标是具有以下结构:

      example.com     // For public
admin.example.com     // For admin
  app.example.com     // For app
      example.com/api // REST API

该如何实现?我该怎么做才能实现?

2 个答案:

答案 0 :(得分:2)

听起来您有三个系统:公共,管理员和共享公共REST api的应用。最好的方法可能是使用诸如AWS CloudFront或Google Cloud CDN之类的内容交付网络(CDN)为三个系统中的每个系统提供静态资源。

另一种方法(虽然不太理想)是使用代理重定向应用程序请求(例如,将https://admin.example.com重定向到https://internal-spring-boot-server/admin)。您可以将Apache mod_proxy与反向代理(请参阅https://httpd.apache.org/docs/2.4/mod/mod_proxy.html)或NGNX反向代理https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

一起使用

答案 1 :(得分:1)

我认为有两种方法可以实现您想做的事情。

您将在DNS plesk / cpanel / ..中配置子域,以查找特定的文档根目录(每个应用程序主目录的路径。) 例如,当有人要求example.com时,请求将要求example.com/main,当有人要求admin.example.com时,请求将要求admin.example.com/admin等。这样,您实际上就忽略了Spring应用中的子域,然后使用RequestMapping值main / admin / etc在@Controller级别操纵路由。

或者,如果您不想弄乱提供商的控制面板,则可以按照this回答的步骤进行。但是然后,您必须实现这三个自定义RequestCondition类,这可能不是最简单的方法。

不是记录最好的答案,但我希望我为您指明正确的方向。