Tomcat 8 URL重写问题

Arv*_*d N 9 apache mod-rewrite tomcat url-rewriting

我有tomcat 8重写工作,但似乎在rewrite.config中丢失了导致最后一个条件不执行的东西.为了其他人的利益,我让RewriteValve适用于我的特定应用程序,而不是全局.对我有用的是下面给出的.

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

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" asyncSupported="true"/>
Run Code Online (Sandbox Code Playgroud)

在我的应用程序的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 
Run Code Online (Sandbox Code Playgroud)

现在,如果URI是js,css等,或者如果URI以/ api/i开头,则表示正在评估重写规则,并且没有进行替换.即在urls下方似乎工作正常,并且没有进行替换.localhost:8080/api/abc/xyz,localhost:8080/css/abc.min.css

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

任何帮助表示赞赏.

mhv*_*und 12

我发现了这个问题,因为我遇到了类似的问题.我花了几个小时寻找一个不要求我将特定文件类型列入白名单的解决方案.最终我反编译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>
Run Code Online (Sandbox Code Playgroud)

/WEB-INF/rewrite.config:

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

结果是Angular应用程序提供了不是真实文件的所有内容.

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


Arv*_*d N 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 
Run Code Online (Sandbox Code Playgroud)

有几件事需要.我确保我的应用程序是默认应用程序的方法是在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>
Run Code Online (Sandbox Code Playgroud)

HTH,谢谢