Tomcat 8.5 переписывает Valve для перенаправления корневого запроса на конкретное веб-приложение

У меня есть требование разрешить пересылку определенных URL-адресов без контекста в определенное веб-приложение.

Итак, у меня развернуто и работает веб-приложение «app1». Следующий URL-адрес http://localhost:8080/app1/ping работает нормально. В $CATALINA_HOME/webapps у меня есть только app1.war, нет ROOT.war

Я хочу настроить клапан перезаписи для перенаправления http://localhost:8080/ping на /app1/ping

В моем server.xml я включил клапан перезаписи. Затем я создал $CATALINA_HOME/conf/Catalina/localhost/rewrite.config со следующим содержимым:

RewriteRule ^/ping /app1/ping

В файле журнала Tomcat я вижу, что правило вызывается:

25-Nov-2019 09:02:11.442 FINE [http-nio-8080-exec-1] org.apache.catalina.valves.rewrite.RewriteValve.invoke Rewrote /ping as /app1/ping with rule pattern ^/ping

Но тем не менее я получаю 404 в браузере для /ping (но не для /app1/ping)

В журнале доступа я вижу, что оба запроса отображаются с одним и тем же URL-адресом, но перенаправленный (первая строка в приведенном ниже журнале) указан с ошибкой 404.

0:0:0:0:0:0:0:1 [25/Nov/2019:09:02:11 +0100] "GET /app1/ping HTTP/1.1" 404 1078
0:0:0:0:0:0:0:1 [25/Nov/2019:09:02:23 +0100] "GET /app1/ping HTTP/1.1" 200 4

Что мне здесь не хватает?

Я использую Tomcat 8.5.40 вместе с Oracle JDK 8 в Windows 10.

Если я добавлю флаг перенаправления в правило:

RewriteRule ^/ping /app1/ping [R]

затем я получаю NPE внутри Tomcat:

java.lang.NullPointerException
  at org.apache.catalina.connector.Response.sendRedirect(Response.java:1318)
  at org.apache.catalina.connector.Response.sendRedirect(Response.java:1288)
  at org.apache.catalina.valves.rewrite.RewriteValve.invoke(RewriteValve.java:435)
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
  at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:609)
  at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
  at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:810)
  at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1506)
  at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
  at java.lang.Thread.run(Thread.java:748)

person a_horse_with_no_name    schedule 25.11.2019    source источник