【问题标题】:Tomcat 8.5 rewrite Valve to redirect root request to specific webappTomcat 8.5 重写 Valve 以将 root 请求重定向到特定的 webapp
【发布时间】:2020-03-20 11:41:35
【问题描述】:

我需要允许将某些没有上下文的 URL 转发到特定的 webapp。

所以,我部署并运行了一个 webapp“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

但是我在浏览器中得到了 /ping 的 404(但不是 /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

我在这里缺少什么?

我在 Windows 10 上使用 Tomcat 8.5.40 和 Oracle 的 JDK 8

如果我在规则中添加重定向标志:

RewriteRule ^/ping /app1/ping [R]

然后我在 Tomcat 中得到一个 NPE:

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)

【问题讨论】:

  • @user7294900:这是关于在单个 Web 应用程序内进行重定向。我实际上是在尝试访问我的 web 应用程序之前这样做,将上下文添加到没有上下文的 URL(不使用 ROOT.war)。我也没有为特定上下文启用阀门(因为它应该没有一个)
  • 我遇到了同样的问题。奇怪的是,我使用 Tomcat 8.5.58 在我的 Windows 开发机器上模拟了你正在做的同样的事情,并且它工作正常,但是 Ubuntu Server 的 Tomcat 8.5.39-1ubuntu1~18.04.3 有你看到的问题。那么这可能是Tomcat中的一个错误?

标签: java tomcat url-rewriting tomcat8.5


【解决方案1】:

这里的问题是没有上下文绑定到请求。确保配置请求绑定到的一些(空)ROOT 上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多