Tomcat 8 URL 重写

Posted

技术标签:

【中文标题】Tomcat 8 URL 重写【英文标题】:Tomcat 8 URL Rewrite 【发布时间】:2015-04-30 07:31:31 【问题描述】:

我有一个 AngularJS webapp 和 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 Rewrite Valve:

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,但它的行为方式相同。

【问题讨论】:

你能为***.com/questions/66472682/…提供解决方案吗 【参考方案1】:

这是作为 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 文件。 这绝对是错误的解决方案。接受的答案是动态的,这个答案是硬编码的 @Talador12,在某些情况下,这很好用并且是合适的。考虑一个服务于多个战争文件的 Tomcat 实例。必须解决动态解决方案以适应任何新的和不同的事物。此解决方案是独立的。【参考方案2】:

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

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

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

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

【讨论】:

但是为什么会出错呢?我有同样的问题。 %REQUEST_FILENAME 始终为 NULL... ... 并且 SCRIPT_FILENAME 是正确的,但 RewriteCond %SCRIPT_FILENAME -f 抱怨资源中缺少前导 /。它是一个Windows系统。所以路径是 C:\... 没有前导 / 在我们的例子中,我们使用 REQUEST_URI 而不是 (REQUEST_FILENAME。我们无法完全删除规则,因为我们无法将资产加载到应用程序本地,但更改了 !-f 和!-d 使用 REQUEST_URI 似乎是有效的,至少现在是这样。【参考方案3】:

我无法让它与 REQUEST_URI 一起使用,而且我也不喜欢将特定文件列入白名单,所以我在 slightly different manner 中解决了这个问题。

【讨论】:

以上是关于Tomcat 8 URL 重写的主要内容,如果未能解决你的问题,请参考以下文章

tomcat 和 apache 整合后利用Tomcat 进行URL重写

tomcat 和 apache 整合后利用Tomcat 进行URL重写

Undertow 启用 url 重写

HTTP错误500.52 - URL重写模块错误。

如何在 NGINX 的代理响应中重写 URL

tomcat-jk-apache整合后 地址UrlRewriter 重写乱码的问题