【问题标题】:Duplication server name in URLURL 中的复制服务器名称
【发布时间】:2019-01-11 16:31:39
【问题描述】:

我在配置 Apache 和 Tomcat 时遇到问题。当tui.org 是我在本地计算机上配置的虚拟主机并且/servlet/url-pattern,它在web.xml 中定义时,我的目的是获得对tui.org/servlet 的寻址能力。但是,我得到 404 Not Found by Tomcat 但我可以通过tui.org/tui.org/servlet 向我的服务器寻址的servelet - 它可以工作。我的服务器上的文件结构如下:

Root: /var/www/tui.org
-------->/WEB-INF/classes/a
-------->/WEB-INF/classes/a/MainServlet.class
-------->/WEB-INF/web.xml
-------->/index.html

我怎样才能实现这种行为?

web.xml:

<servlet-mapping>
    <servlet-name>mainServlet</servlet-name>
    <url-pattern>/servlet</url-pattern>
</servlet-mapping>

我的 server.xml:

<?xml version="1.0" encoding="UTF-8"?>

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="/var/www/"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

tui.org 的配置(tui.org.conf at /etc/apache2/sites-available:

<VirtualHost *:80>
    ServerName tui.org
    DocumentRoot /var/www/tui.org

    <Directory /var/www/tui.org>
        AllowOverride All
    Require all granted
    </Directory>

    JkMount /servlet* ajp13_worker
</VirtualHost>

我使用 Apache2、tomcat9 和 Ubuntu 18.04。

提前谢谢你!

附:对不起我的英语。

【问题讨论】:

    标签: java apache tomcat localhost virtualhost


    【解决方案1】:

    这里有几个问题:

    • 不得使用 Apache 提供 Web 应用程序目录 - 例如您为 Apache 声明 DocumentRoot /var/www/tui.org,为 Tomcat 声明 &lt;Host appBase="/var/www/"&gt;
      • 例如但不限于:servlet 规范明确禁止将目录 WEB-INF 提供给客户端,而您明确绕过了此限制。
    • 部署在HostappBase 中的应用程序始终以该名称部署(除非在 context.xml 文件中以不同方式指定)。该规则的唯一其他例外是​​如果一个目录被称为ROOT - 在这种情况下,它是在没有名称的情况下部署的,因此省略了服务器名称后面的 tui.org。
      • 但这对于通过 Apache httpd 为整个 webapp 提供服务的问题是次要的。先修复那个

    解决最大问题的一种方法是在 Apache 中省略 DocumentRoot 指令,而是从 Tomcat 中提供所有内容:JkMount * ajp13_worker

    【讨论】:

    • 但是我想用 apache 处理静态文件(例如 html/css/gif/etc),用 tomcat 处理 servlets/jsp。它 (JkMount * ajp13_worker) 不允许这样做。 Apache 可以拒绝所有WEB-INF 的访问。 webapps 是一个错误 - 我粘贴了旧的配置文件。问题已经解决了。现在我发布答案。
    【解决方案2】:

    为了解决tui.org/servlet 寻址的问题,我必须将&lt;Context&gt; 指令添加到server.xml

    <Context path="" docBase="/var/www/tui.org/"/>
    

    并将appBase/var/www/ 更改为/var/www/tui.org/

    为了解决访问WEB-INF 的问题(感谢@OlafKock),我必须在tui.org.conf 旁边添加:

    <Directory /var/www/tui.org>
        AllowOverride All
    Deny from all
    </Directory>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-02
      • 2016-10-26
      • 1970-01-01
      • 2015-03-26
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多