问题 如何在J2EE Web应用程序中创建类似“http://username.example.com”的域?


我是一名Web应用程序开发人员,只是一名初学者。 我正在设计一个小的J2EE Web应用程序(例如,服务名称就像 http://www.example.com)。它使用Apache Tomcat。 规范:当用户注册Web应用程序时,他将获得一个自定义域名

http://username.example.com 

如何在我的Web应用程序中完成此操作。我还在开发应用程序。我还没有托管它。


12944
2018-02-06 06:01


起源

将来,请将Apache Tomcat问题标记为 tomcat而不是 apache! - BalusC


答案:


您需要为Apache配置中的每个子域创建一个虚拟主机,如:

<VirtualHost *:80>
  ServerAdmin webmaster@subdomain1.example.com
  DocumentRoot /www/subdomain1.example.com
  ServerName subdomain1.example.com
  ErrorLog logs / subdomain1.example.com-host.example.com-error_log
  CustomLog logs / subdomain1.example.com-access_log common
  </虚拟主机>

但是有一个问题。如果您的解决方案需要创建文件夹,虚拟主机添加和apache重新启动,这对我来说不太好。我该如何处理这个问题是:

  1. 为“* .example.com”创建通配符虚拟主机,以便对子域的所有请求都转到此虚拟主机。
  2. 为它设置重写规则,将所有请求重定向到一个页面,比如index.jsp
  3. 使用用户来的主机名编写一个JSP页面,通过它将重定向URL搜索到存储,即mysql db,并重定向到它。此脚本将是通配符主机上的index.jsp脚本。

如果您使用这种方式,您只需要设置上面一次,然后将子域添加到存储中,这似乎是比创建子文件夹和修改Apache配置更灵活的解决方案。


4
2018-02-06 09:54



这是Apache httpd配置还是Apache Tomcat配置? - Thorbjørn Ravn Andersen
所以我需要为我的网站中的“每个用户”进行此配置? - Anand
@lakshmanan:你最初用“apache”而不是“tomcat”来标记问题。 “apache”一词与“Apache HTTPD Server”同义,而不是“Apache Tomcat”。您错误地从Sam,kinjal和Vincent获得了基于Apache HTTPD的答案。那些 不 适用于Tomcat。但是,您可以在Apache Tomcat旁边安装Apache HTTP Server,并在Tomcat Connector(mod_jk)的帮助下将其作为代理放在Tomcat之前。对于真正的Apache Tomcat答案,请查看Thorbjorn和mjustin的答案。 - BalusC


你有两个问题。

首先,您需要让用户的浏览器识别“username.mysite.com”所在的位置。这需要DNS配置,通常采用“CNAME通配符”的形式。请注意,如果您想在试用阶段自己控制,dyndns.org会在其动态DNS专业版程序包中提供此功能。

第二个是你需要告诉Tomcat从主机名派生用户,并为每个用户提供一个特殊的站点。最简单的方法是,最有可能的方法是在URL中的主机名上设置一个“品味”的servlet过滤器,并设置jsp页面所需的属性。


4
2018-02-06 12:05





如果您在Windows上,请编辑\ windows \ system32 \ drivers \ etc \ hosts文件并添加如下所示的行:

127.0.0.1  username.mysite.com

然后当服务器运行时,您可以打开浏览器并键入:

http://username.mysite.com
http://username.mysite.com:8080

或者其他什么,看看网站。

你需要管理员权限。

如果您使用的是Linux,则需要编辑/ etc / hosts,并执行相同的操作。

但是,在部署时,更多的是配置Web服务器和DNS服务器。因此,如果您想获得完整的体验,则应在本地安装dns服务器并将其用作网络名称服务器。这是一个更复杂的任务,说明取决于您是在Linux还是Windows,以及您正在使用的Web服务器。

然后你必须在应用程序中编写一些代码来检查服务器变量以找出使用了哪个子域,并根据它进行处理。


2
2018-02-06 06:20



我希望在应用程序运行时为所有用户提供此功能..这可能吗?我该怎么做 ?用户进入他的域名并通过该域名登录他的帐户... - Anand
如果你能告诉我你是在Windows还是linux上,我可以发布具体说明。 - Kinjal Dixit
如果你们两种类型,请告诉我们,因为我们渴望获得这两种情况的知识 - Ashish Agarwal
我在Ubuntu linux工作 - Anand


看起来您正在寻找Tomcat上的虚拟主机。然后需要在Tomcat中配置子域:

http://tomcat.apache.org/tomcat-6.0-doc/virtual-hosting-howto.html

Web应用程序仅控制从上下文根开始的URL部分。因此,如果“www.mysite.com/”上有一个网络应用程序,它可以处理“www.mysite.com/alice”或“www.mysite.com/bob”的请求,但它不会处理“alice”的请求.mysite.com /“如果尚未在Tomcat服务器中配置。这意味着,对于每个新用户,需要使用新的子域配置Tomcat。我认为这不能在Web应用程序中完成。


2
2018-02-06 07:28



这样的工作怎么办?对于每个用户都是,有一个子域。像alice.mysite.com,用户只能通过自己的域名登录。 - Anand


您可以创建通配符虚拟主机

<VirtualHost *:80>
    ServerName example.com
    ServerAlias *.example.com
</VirtualHost>

然后使用类似的东西处理应用程序代码中的子域 HttpServletRequest#getRequestURL() 


0
2018-02-06 10:23



为什么选择downvote?如果我理解Sam Rudolph,则需要一个通配符虚拟主机(作为解决方案的一部分) - mjn
是的,但我的主张是处理应用程序本身的子域,而不是重写规则。 - Vincent Robert


我知道这是一个老问题,但我实际上想出了一个适用的答案 Tomcat的 最近:

首先,你需要Apache背后的Tomcat。

其次,您需要创建一个这样的网站定义:

<VirtualHost *:80>

    ProxyRequests On
    ProxyVia On
    <Proxy http://example.com>   #FIXDOMAIN
        Order deny,allow
        Allow from all
    </Proxy>

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(.+)\.example\.com$ [NC]   #FIXDOMAIN
    RewriteRule ^(.*)$ http://example.com$1?proxy_domain=%{HTTP_HOST} [P,QSA]    #FIXDOMAIN

    JkMount /* default

    ServerName example.com    #FIXDOMAIN
    ServerAlias *.example.com    #FIXDOMAIN

    <!-- Other normal options go here -->

</VirtualHost>

第三,您需要在Tomcat中设置您的虚拟域 example.com

<Host name="example.com" appBase="webapps-example"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
    <Alias>www.example.com</Alias>
</Host>

这将创建Apache可以处理的通配符域。该 mod_rewrite 规则会将URL重写为Tomcat理解的单个URL。然后,通过 mod_proxy,子域域代理到基域,以及 GET 参数调用 proxy_domain (在现有GET参数的基础上添加)以确定原始用户名是什么。

由于Apache Tomcat这样做,这是一个非常复杂的(可能不是非常可扩展的解决方案)  支持通配符域。但它确实有效!


0
2017-08-04 04:57