Tomcat 8 URL重写问题

时间:2016-01-05 19:28:53

标签: 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重写线程中看到的反馈之后,说明了使用{REQUEST_FILENAME}为空的问题。我没有使用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 / i开头,则表示正在评估重写规则,并且没有进行替换。 即下面的网址似乎工作正常,没有进行替换。 localhost:8080 / api / abc / xyz,localhost:8080 / css / abc.min.css

但是由于某种原因,即使URI有一个有效的被它击中,最后一条规则也没有被击中。对于前者。像localhost:8080 / def / ghi这样的URL应该被重定向到index.html,但它似乎没有被重写。我不确定我在rewrite.config中丢失了什么导致此行为。 我可以搬到一个!条件也做了重写,但只是想在我使用Mulitple RewriteRule组合时明白我的理解。

感谢任何帮助。

2 个答案:

答案 0 :(得分:10)

我发现了这个问题,因为我遇到了类似的问题。我花了几个小时寻找一个不要求我将特定文件类型列入白名单的解决方案。最终我反编译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,其中AoT编译的Angular2(v4.0.0)应用程序嵌套在现有的Web应用程序中。

答案 1 :(得分:7)

我好像修好了。我找到了几件事,并为其他人分享。下面的事情终于为我工作了。以下是rewrite.config中的内容。它应该放在webapps // WEB-INF /目录中。

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

RewriteRule ^(.*)$ /index.html 

需要做一些事情。我确保我的应用程序是默认应用程序的方法是在server.xml中的HOST配置中添加以下代码段。请注意,如果您使用此方法将您的应用程序设置为默认应用程序,则应在server.xml中的Context块中完成阀门添加,并且它可以正常运行并将其放入您的应用程序/ META-INF / context.xml中似乎可以做到这一点。它肯定会加载配置,但不会重写。保存在application / META-INF / context.xml中的PreResources事情似乎工作正常。

server.xml片段

<Host name="localhost"  appBase="webapps"
            unpackWARs="false" autoDeploy="false" deployOnStartup="false">

        <Context path="" docBase="myapp" reloadable="false">
            <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" asyncSupported="true"/>
        </Context>  
        ....
</Host>

HTH,谢谢