Имя сервера дублирования в URL

У меня проблема с настройкой Apache и Tomcat. Моя цель - получить возможность обращаться к tui.org/servlet, когда tui.org - мой виртуальный хост, настроенный на локальном компьютере, а /servlet/ - это url-pattern, который определен в web.xml. Но вместо сервлета я получаю 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. Извините за мой английский.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Здесь есть несколько проблем:

  • Вы не должен обслуживаете каталог веб-приложений с Apache - например, вы объявляете DocumentRoot /var/www/tui.org для Apache и <Host appBase = "/var/www/"> для Tomcat.
    • например, но не ограничиваясь этим: Спецификация сервлета специально запрещает обслуживание каталога WEB-INF для обслуживания клиента, и вы явно обходите это ограничение.
  • Приложение, развернутое в HostappBase, всегда развертывается под этим именем (если иное не указано в файле context.xml). Единственным другим исключением из этого правила является каталог с именем ROOT - в этом случае он развертывается без имени, таким образом опуская tui.org, который следует за именем вашего сервера.
    • но это вторично по отношению к проблеме обслуживания всего веб-приложения через Apache httpd. Сначала исправьте Вон тот.

Один из способов решить вашу самую большую проблему - опустить директиву DocumentRoot в Apache и использовать все из Tomcat: JkMount * ajp13_worker.

Но я хочу обрабатывать статические файлы (например, html / css / gif / etc) с помощью apache и servlets / jsp с помощью tomcat. Он (JkMount * ajp13_worker) не позволяет этого делать. Apache может запретить всем доступ для WEB-INF. webapps - ошибка - я вставил старые файлы конфигурации. Вопрос решили. Сейчас отправляю ответ.

user8092801 07.08.2018 15:15
Ответ принят как подходящий

Для решения проблемы с обращением по 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>

Другие вопросы по теме