Tomcat 8 URL Rewrite

2022-09-03 13:53:56

我有一个AngularJS webapp和Jersey后端。我需要设置URL重写,所以除了给定的例外之外,所有内容都将重写为Angular的索引.html。

例如:

http://my.domain.com/about will be rewritten
http://my.domain.com/photos/photo1.jpg will NOT be rewritten (file photo 1 exists)
http://my.domain.com/rest/myservice will be NOT be rewritten (it is a call to REST service)

我设置了Tomcat 8 URL重写阀,如下所示:

conf/server 中.xml

<Host name="my.domain.com" appBase="webapps/MyDomainServer" unpackWARs="true"
           autoDeploy="true"
           xmlValidation="false" xmlNamespaceAware="false">
  <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
  <!-- access logging, aliases,...-->
</Host>

in conf/Catalina/my.domain.com/rewrite.config

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} ^/rest.*
RewriteRule ^ - [L]

RewriteRule ^ index.html [L]

Tomcat忽略了我的重写设置,没有重写任何内容,日志中没有错误/异常。我做错了什么?提前致谢。

我试图将RewriteValve移动到config.xml META-INF中,并将config重写到WEB-INF,但它的行为方式相同。


答案 1

我已经找到了解决方案,问题在错误/错误的重写.config文件中。正确的应该是:

RewriteCond %{REQUEST_URI} ^/(css|img|js|partials|rest|favicon).*$
RewriteRule ^.*$ - [L]

RewriteRule ^.*$ /index.html [L,QSA]

第一行是枚举的URI,不应重写。其他所有内容都将重写为索引.html。


答案 2

这是否部署为 Java Web 应用 (WAR)?您可以在 Web 中实现此.xml:

<servlet>
   <servlet-name>index</servlet-name>
   <jsp-file>/index.html</jsp-file>
</servlet>

<servlet-mapping>
   <servlet-name>index</servlet-name>
   <url-pattern>/</url-pattern>
   <url-pattern>/about</url-pattern>
   .. as many as you need ..
<servlet-mapping>

推荐