【问题标题】:Tomcat 8.0 Rewrite ValveTomcat 8.0 重写 Valve
【发布时间】:2014-11-14 14:29:36
【问题描述】:

我正在尝试在 Tomcat 8.0 中使用 RewriteValve http://tomcat.apache.org/tomcat-8.0-doc/rewrite.html

在$CATALINA_HOME/conf/server.xml,我添加了

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

在主机标签的正下方

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">

$CATALINA_HOME/conf 目录中创建了rewrite.config,内容如下

RewriteRule ^/abc /myapp

http:/host:port/myapp 是一个工作网络应用程序。

所以现在当我转到 http://host:port/abc 时,我希望被重定向到 http://host:port/myapp 但我得到的是 404 the requested resource is not available

它看起来甚至没有读取我的 rewrite.config 文件。日志目录中的访问日志只报告了"GET /abc HTTP/1.1" 404 1000,没有进一步的细节。

我错过了什么?谢谢

【问题讨论】:

  • 您是否为RewriteValve 启用了调试日志记录?日志中有什么相关的吗?乍一看,你所拥有的看起来是正确的。您使用的是什么版本的 Apache Tomcat?
  • 如何为RewriteValve 启用调试日志记录?我正在使用 Tomcat 8.0.15
  • 哦,不幸的是,RewriteValve 不使用自己的(特定于类的)记录器。相反,它记录到其容器的阀门。因此,如果您将&lt;Valve&gt; 配置为&lt;Host&gt; 的子级,则需要更改主机上的日志级别(例如:org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = DEBUG)。
  • 好的,现在我们到了某个地方。调试不起作用。我在 conf/logging.properties 中添加了org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = FINE,并在 localhost.2014-11-19.log 中看到了19-Nov-2014 13:30:21.322 FINE [Catalina-startStop-1] org.apache.catalina.valves.rewrite.RewriteValve.startInternal No configuration resource found: Catalina/localhost/rewrite.config in ...。所以我将我的 rewrite.config 文件从 /conf 移动到 conf/Catalina/localhost ,现在它正在接收我的重写规则。也许文档可以更清楚地说明这一点。谢谢。
  • 是的,我注意到文档还有很大的改进空间。 RewriteValve 是一个新功能,它的使用范围并不大,所以这是很好的反馈。

标签: tomcat


【解决方案1】:

在 Tomcat 文档中http://tomcat.apache.org/tomcat-8.0-doc/rewrite.html 是这样写的

重写阀可以配置为添加到主机中的阀。有关如何配置它的信息,请参阅虚拟服务器文档。它将使用包含重写指令的 rewrite.config 文件,它必须放在主机配置文件夹中。

所以尝试将rewrite.config 移动到$CATALINA_HOME/conf/Catalina/localhost

小提示:你可以在rewrite.config 中拼错一些东西(例如xxRewriteRule),然后如果tomcat 读取这个文件就会失败。我认为在你的情况下,即使你拼错了某些东西(因为它没有被读取),tomcat也会启动。

【讨论】:

    【解决方案2】:

    如果您想要不同于默认路径$CATALINA_HOME/conf/Catalina/localhost 的内容,您可以使用RewriteValve xml 定义中的resourcePath 字段来指定配置文件的相对路径。 (诚​​然,我没有使用过这个。)

    或者,您可以将阀门添加到 $CATALINA_HOME/conf/context.xml,然后将 rewrite.config 移动到您的 Web 应用程序的 WEB-INF 文件夹中。

    来自documentation

    它也可以在 webapp 的 context.xml 中。然后阀门将使用包含重写指令的 rewrite.config 文件,它必须放在 Web 应用程序的 WEB-INF 文件夹中

    【讨论】:

    • resourcePath 字段设置不起作用。尝试设置它时,它不是一个可识别的属性。另外,您可以在 $CATALINA_BASE/conf/[engine]/[hostname]/your_app.xml 中定义阀门,并将 rewrite.config 放在应用程序(your_app)的 WEB-INF 目录中。
    • @Achille 这似乎对我也不起作用,在 8.0.53 上。 RewriteValve 根本没有输出。
    【解决方案3】:

    我必须在 server.xml 中注释掉 AccessLogValve,我的重写阀才能工作

    【讨论】:

      【解决方案4】:

      根据apacheDoc

      重写阀配置为使用 org.apache.catalina.valves.rewrite.RewriteValve 类名的阀。

      重写阀可以配置为添加到主机中的阀。有关如何配置它的信息,请参阅虚拟服务器文档。它将使用包含重写指令的 rewrite.config 文件,它必须放在 Host 配置文件夹中。

      它也可以在 webapp 的 context.xml 中。然后阀门将使用包含重写指令的 rewrite.config 文件,它必须放在 Web 应用程序的 WEB-INF 文件夹中

      【讨论】:

        猜你喜欢
        • 2015-10-11
        • 2020-03-20
        • 1970-01-01
        • 1970-01-01
        • 2020-10-02
        • 2013-08-29
        • 1970-01-01
        • 1970-01-01
        • 2016-02-09
        相关资源
        最近更新 更多