如何获得基于不同DNS的自定义登录页面?

如何获得基于不同DNS的自定义登录页面?,dns,Dns,设置: 我有一个为多个组织服务的web应用程序。每个组织都有自己的徽标、配色方案等,我会在他们登录后从数据库中检索它们 每个组织都有自己的子域来访问我的应用程序。所以我有example.com。Org1将通过进入Org1.example.com进入我的登录屏幕 我想能够提供自定义的标志,造型等基于该子域,但不知道如何才能做到这一点 谢谢 根据您使用的语言、应用程序服务器和操作系统的不同,有很多方法可以做到这一点 大多数情况下,人们选择为每个域名运行一个新的应用实例,以便应用服务器知道每个请求必须

设置: 我有一个为多个组织服务的web应用程序。每个组织都有自己的徽标、配色方案等,我会在他们登录后从数据库中检索它们

每个组织都有自己的子域来访问我的应用程序。所以我有example.com。Org1将通过进入Org1.example.com进入我的登录屏幕

我想能够提供自定义的标志,造型等基于该子域,但不知道如何才能做到这一点


谢谢

根据您使用的语言、应用程序服务器和操作系统的不同,有很多方法可以做到这一点

大多数情况下,人们选择为每个域名运行一个新的应用实例,以便应用服务器知道每个请求必须映射到哪个实例。因此,在这种情况下,您没有任何程序来处理此问题。每个实例都配置了特定的徽标、配置文件、数据库连接等

但当然,您只能使用应用程序的一个实例,并使用编程技巧了解每个请求的目标域。这不太常见,但也有一些优势,例如,如果您希望在所服务的不同域之间共享某些信息:您可能希望将公共信息发送给不同的客户端,而不希望从数据库多次加载这些信息,只是因为您不想支付通过外部组件共享信息的开销(例如,出于性能原因)。因此,您可以在独特应用程序的内存中维护这些信息。存在基于内存的分布式数据库(例如memcached),但其速度永远不会像使用具有单个内存空间的单个应用程序那样快

以下是最常见的方法:

  • 为每台服务器配置不同的IP地址:让org1.example.com解析为1.2.3.4,org2.example.com解析为1.2.3.5,然后修改应用程序以绑定1.2.3.4(端口80)上的服务器套接字和1.2.3.5(相同端口)上的另一个套接字。然后,在主循环中,当您在第一个套接字上接受连接时,您知道org1是目标,当您在另一个套接字上接受连接时,org2是目标

    下面是这样一个主循环的C绑定:在每个套接字上使用
    bind()
    将其绑定到特定的本地地址,然后使用
    select()
    等待其中一个套接字上的连接,当
    select()
    返回时,检查侦听队列中具有挂起连接的套接字,以了解哪个域是目标域(然后,在此套接字上调用
    accept()
    ,以获取专门用于此连接的新通信套接字)

    如果您使用的是web或应用服务器,如Apache、Nginx、Tomcat、JBoss等,那么这个编程方案已经在服务器内部开发,因此对您来说,这只是一个配置问题

  • 配置相同的IP地址并检查HTTP/1.1附带的
    主机:
    头。这样,您就知道目标是哪个域。您可以将服务器配置为执行此任务,并根据目标调用不同的脚本、应用程序或页面。但你可以配置你的服务器不这样做,并在你的应用程序中实现你的自定义行为。例如,使用Java和Servlet容器,您可以简单地调用以下标准Servlet API:
    request.getHeader(“主机”)
    (request是服务器在调用某些Servlet回调函数时提供给您的
    javax.Servlet.http.HttpServletRequest
    的实例)


注意:如果您使用的是通过SSL/TLS的加密连接,则在SSL/TLS网络层的SNI可选字段(服务器名称指示)中有一个主机名。此信息应与HTTP主机头中包含的信息完全相同。但是一些web客户端没有为这两个占位符设置相同的值。这被称为域前沿。许多应用程序服务器不检查这两个值是否相同。因此,如果您不想被一些客户端(如不公平的机器人)黑客攻击,您应该通过编程方式自己检查它(域名前置也被公平的应用程序使用,如Telegram,但这是另一种情况)。

检查应用程序中的
主机:
HTTP头。您能提供更多信息吗?您使用的是哪种(操作)系统?哪个显示器/窗口管理员?