URL 中的复制服务器名称

Duplication server name in URL

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

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 /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.

提前致谢!

P.S。对不起我的英语。

这里有几个问题:

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

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

为了解决 tui.org/servlet 的寻址问题,我不得不将 <Context> 指令添加到 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>