spring-boot + tomcat RewriteValve

bil*_*lak 5 spring-boot

有可能以某种方式使用RewriteValve自定义嵌入式tomcat 吗?正如我在api中看到的那样,目前只有addContextValvesaddEngineValves的方法,但是在文档中作为尖头tomcat,RewriteValve应该放在Host或webapp的context.xml中.我不明白是否addContextValves可以为此工作.

谢谢

Krz*_*nik 5

对的,这是可能的。这是您需要遵循的两个步骤:

  1. 实现您自己的 TomcatEmbeddedServletContainerFactory bean 并设置 RewriteValve

      import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;  
      ...
      import org.apache.catalina.valves.rewrite.RewriteValve; 
      ... 
    
      @Bean TomcatEmbeddedServletContainerFactory servletContainerFactory() {
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
        factory.setPort(8080);
        factory.addContextValves(new RewriteValve());
        return factory;
      }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将 rewrite.conf 文件添加到您的应用程序的 WEB-INF 目录并指定重写规则。这是一个示例 rewrite.conf 内容,我在 angular 应用程序中使用它来利用 angular 的 PathLocationStrategy (基本上我将所有内容重定向到 index.html 因为我们只使用 spring boot 来提供静态 Web 内容):

      RewriteCond %{REQUEST_URI} !^.*\.(bmp|css|gif|htc|html?|ico|jpe?g|js|pdf|png|swf|txt|xml|svg|eot|woff|woff2|ttf|map)$
      RewriteRule ^(.*)$ /index.html [L]
    
    Run Code Online (Sandbox Code Playgroud)