У меня есть требование разрешить пересылку определенных 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)