2015-02-27 13 views
9

Ich habe eine AngularJS Webapp und Jersey Backend. Ich muss das URL-Rewriting einrichten, also wird alles außer Ausnahmen in Angulars index.html umgeschrieben.Tomcat 8 URL Rewrite

Eg .:

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) 

Ich habe die Tomcat 8 URL Rewrite Ventil wie folgt festgelegt:

in 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> 

in 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 ignoriert meine Einstellungen zum Neuschreiben, es wird nichts neu geschrieben, im Protokoll ist kein Fehler/Ausnahmefehler. Was mache ich falsch? Danke im Voraus.

Ich habe versucht, RewriteValve zu config.xml in META-INF zu verschieben und Config in WEB-INF umschreiben, aber es verhält sich auf die gleiche Weise.

Antwort

7

ich die Lösung gefunden haben, Problem war in falsch/fehlerhaft rewrite.config Datei. Correct sollte sein:

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

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

In der ersten Zeile werden aufgezählt URIs, die nicht neu geschrieben werden soll. Alles andere wird in index.html umgeschrieben.

+1

Aber warum war es fehlerhaft? Ich habe das gleiche Problem. % {REQUEST_FILENAME} ist immer NULL ... –

+1

... und SCRIPT_FILENAME ist korrekt, aber RewriteCond% {SCRIPT_FILENAME} -f beschwert sich über ein fehlendes Vorzeichen/in der Ressource. Es ist ein Windows-System. Also ist der Pfad C: \ ... ohne vorangestellt/ –

+0

In unserem Fall haben wir {REQUEST_URI} anstelle von (REQUEST_FILENAME} verwendet. Wir konnten die Regeln nicht komplett löschen, da wir keine lokalen Assets für die Anwendung laden konnten Das Ändern von! -f und! -d, um REQUEST_URI zu verwenden, scheint zu funktionieren, zumindest für den Moment. –

3

Wird dies als Java Web App (WAR) bereitgestellt? Sie könnten dies in Ihrem web.xml implementieren:

<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> 
+0

Dank Nicholas, das scheint eine interessante Option zu sein, aber ich habe es geschafft, es durch Umschreiben zu lösen. Ich hatte eine fehlerhafte rewrite.config Datei. – kamelot

0

Ich konnte dies nicht mit der REQUEST_URI arbeiten, und ich wollte nicht sowieso spezifische Dateien auf die weiße Liste setzen, also löste ich es in einer slightly different manner.