Tomcat 8 URL Rewrite

16

我有一个使用AngularJS编写的Web应用程序和Jersey后端。我需要设置URL重写,以便除了给定的例外情况,其他所有内容都将被重写为Angular的index.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>

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移动到META-INF的config.xml中并将重写配置重写为WEB-INF,但它的行为方式相同。


你们能提供一个解决方案来解决 https://stackoverflow.com/questions/66472682/redirect-sub-domain-to-specific-mapping 的问题吗? - aditya desai
3个回答

13

我已找到解决办法,问题在于错误/有故障的rewrite.config文件。正确的应该是:

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

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

第一行列出的URI不应被重写,其他所有内容都将被重写为index.html。


1
但是为什么会有问题呢?我也遇到了同样的问题。%{REQUEST_FILENAME} 总是为空... - Mario Eis
1
...并且SCRIPT_FILENAME是正确的,但RewriteCond %{SCRIPT_FILENAME} -f抱怨资源中缺少前导/。这是一个Windows系统。因此路径为C:\ ... 没有前导/。 - Mario Eis
在我们的情况下,我们使用了{REQUEST_URI}而不是(REQUEST_FILENAME)。我们无法完全放弃规则,因为我们无法加载应用程序本地的资源,但将!-f和!-d更改为使用REQUEST_URI似乎正在起作用,至少目前是这样。 - Dave DuPlantis

5

这是一个部署为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>

谢谢Nicholas,这似乎是一个有趣的选择,但我已经通过重写解决了它。我的rewrite.config文件有问题。 - kamelot
这绝对是错误的解决方案。被接受的答案是动态的,而这个答案是硬编码的。 - Talador12
2
@Talador12,对于某些情况,这种方法很有效并且是合适的。考虑一个Tomcat实例服务多个war文件。动态解决方案必须被处理以适应任何新的和不同的情况。这个解决方案是自包含的。 - J E Carter II

3

我无法使用 REQUEST_URI 实现此功能,而且我也不喜欢必须列出白名单文件,所以我用了一种略微不同的方式来解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接