Apache Tomcat中的Angular2路由不使用重定向

时间:2016-11-28 10:30:48

标签: apache tomcat angular angular-routing

我正在使用Angular2和Apache Tomcat 8.当使用根URL打开我的网站时,它可以工作,点击按钮会重定向到特定网址。但是当手动打开特定网址或重新加载网页时,它会给我一个404.

我找到了这个解决方案:Angular 2.0 router not working on reloading the browser但是没有解释如何使用tomcat解决它。

我在tomcat8的web.xml中试过这个:

  <servlet>
    <servlet-name>html-mapping</servlet-name>
    <jsp-file>/index.html</jsp-file>
  </servlet>

  <servlet-mapping>
    <servlet-name>html-mapping</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

然后我没有404了(它加载了所有文件,如main.bundle.js),但只显示了Angular2“Loading ...”文本,并且它不会继续打开WebApp。

4 个答案:

答案 0 :(得分:0)

刚刚在项目中解决了这个问题。这里需要的只是创建一个非常简单的servlet,并为该servlet提供允许书签/刷新所需的映射。从这里你的servlet什么都不做,但是:

(.start (Thread. (fn [] ...)))

应该照顾它。

答案 1 :(得分:0)

我有类似的问题。原因是角色路由中使用的虚拟URL被Tomcat视为文件,因此当文件不存在时404。我用它解决了 URL rewriting

答案 2 :(得分:-1)

我遇到了这个问题,我尝试了很多选项来解决它,而没有真正得到我想要的干净解决方案。我想在没有模板引擎的情况下提供我的index.html文件。但是当我这样做的时候,当我精神焕发时,我一直得到404。原因是因为应用程序没有正确跟踪您的路径。好吧,它正确地做到了但不是你想要的方式。

对我来说,我的解决方案是npm install hbs。使用把手作为模板引擎,让我创建一个index.hbs页面,然后将应用程序移到angular2。我只将它用于那一页,无论出于什么原因,它都能为我提供我想要的功能而无需获得404.

如果您想采用该路线,只需将其添加到app.js并创建一个新的index.hbs文件。然后将其添加到模板引擎中,如下所示,

// view engine setup
app.set('views', path.join(__dirname, 'public'));
app.set('view engine', 'hbs');

另一种方法是使用HashBang方法,您可以在this answer here看到有关该方法的信息,

我不喜欢那条路线,因为它会在网址上添加主题标签,导致其他烦人的问题。我找到了最干净的方法来使用车把。基本上,您只需将当前的index.html文件更改为.hbs,然后将其作为应用引擎添加到app.js文件中。只要确保你的路径正确,它就知道在哪里找到它。

答案 3 :(得分:-1)

Tomcat有a built-in solution for this

这应该适用于任何具有UI路由的单页应用程序框架,例如Angular,React,ExtJS等。


简而言之:

1)将RewriteValve添加到     webapps/{your-web-app-directory}/META-INF/context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context>  
  <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
  ... your other context items
</Context>

2)为/webapps/{your-web-app-directory}/WEB-INF/rewrite.config上的所有路由添加重写规则

例如,如果您在Angular应用中定义了“用户”,“家庭”和“联系人”的UI路由:

RewriteRule ^/user(.*)$    /index.html [L]
RewriteRule ^/home(.*)$    /index.html [L]
RewriteRule ^/contact(.*)$ /index.html [L]

这些简单的规则告诉Tomcat将所有带有这三个命名路径的请求直接发送到index.html。

但是这些规则可能会更有趣,例如将所有请求发送到index.html except 的某个路径,例如用于必须去其他地方的/api个呼叫。上面的链接文本涵盖了所有详细信息。