apache - Tomcat 8 URL 重写问题

标签 apache tomcat mod-rewrite url-rewriting

我已经让 tomcat 8 重写工作,但似乎在 rewrite.config 中遗漏了一些导致最后一个条件不执行的东西。 为了他人的利益,我有 RewriteValve 来为我的特定应用程序工作,而不是在全局范围内工作。下面给出了对我有用的方法。

在我的应用程序的 META-INF context.xml 文件中,我包含了以下行

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

在我的应用程序的 WEB-INF 中,我有一个 rewrite.config 文件,在合并了在其他 tomcat 8 重写线程中看到的反馈后,我有一个 rewrite.config 文件,关于使用 {REQUEST_FILENAME} 为 null 的问题。我没有使用 REQUEST_FILENAME,我的配置如下所示。

RewriteCond %{REQUEST_URI} .*\.(css|js|html|png|jpg|jpeg|gif|txt|ico) [OR]
RewriteCond %{REQUEST_URI} ^\/api\/ [OR] 
RewriteRule ^(.*)$ - 

RewriteRule ^(.*)$ /index.html 

现在,如果 URI 是 js、css 等,或者如果 URI 以/api/开头,我会看到正在评估重写规则并且没有进行替换。 即下面的网址似乎工作正常,没有进行任何替换。 localhost:8080/api/abc/xyz , localhost:8080/css/abc.min.css

但出于某种原因,即使 URI 有一个有效的规则可以被它击中,最后一条规则也根本没有被击中。例如。像 localhost:8080/def/ghi 这样的 URL 应该被重定向到 index.html,但它似乎没有被重写。我不确定我在导致此行为的 rewrite.config 中缺少什么。 我可以搬到一个!也有条件进行重写,但只是想在我使用 Mulitple RewriteRule 组合时弄清楚我的理解。

感谢任何帮助。

最佳答案

我发现这个问题是因为我遇到了类似的问题。我花了几个小时寻找不需要我将特定文件类型列入白名单的解决方案。最终我反编译了 org.apache.catalina.valves.rewrite.RewriteValve 并找到了答案。

我的情况类似,但我的 Angular 应用程序嵌套在一个较旧的非 Angular 应用程序中。这意味着它的 URL 有点像 http://localhost:8080/mywebapp/ng/index.html(应用程序的 base-href 因此是“/mywebapp/ng”)。

我没有使用 REQUEST_URI、REQUEST_FILENAME 或 SCRIPT_FILENAME 的规则。对我有用的是 SERVLET_PATH(不知道为什么)。

我最终得到了一个包含这两个文件的解决方案:

/META-INF/context.xml:

<?xml version='1.0' encoding='utf-8'?>
<Context>
    <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
</Context>

/WEB-INF/rewrite.config:

RewriteCond %{SERVLET_PATH} !-f
RewriteRule ^/ng/(.*)$ /ng/index.html [L]

结果是所有不是真实文件的东西都由 Angular 应用提供。

注意:这适用于 Tomcat 8.0,带有嵌套在现有 Web 应用程序中的 AoT 编译的 Angular2 (v4.0.0) 应用程序。

关于apache - Tomcat 8 URL 重写问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34619751/

相关文章:

apache - iCloud Drive 上的 macOS Sierra Sites 文件夹如何转移到本地主机?

apache - 设置子域: ex -- "www.example.com" to store images at "images.example.com"

web-applications - 如何从客户端使用 http 代理的 Web 应用程序检测 - 为什么缺少 XFF header ?

安装 XAMPP 后 Tomcat 服务未运行

php - htaccess 从 index.php 重定向到/仅在特定文件夹中

.htaccess - 我应该从哪里了解 htaccess

php - htaccess 重定向以删除 index.php

Python - 使用正则表达式解析 apache 配置

java - 以编程方式停止 H2 数据库

url - .htaccess RewriteRule 将目录类型的 URL 结构转换为查询