Windows vs Linux上的Tomcat / Angular应用程序和尾随斜杠

时间:2016-07-20 16:02:52

标签: angularjs linux windows-7 tomcat7

我有一个问题,我不确定是否与angular或我的服务器(tomcat 7)有关。

到目前为止,我一直在我的本地计算机上进行开发,这是一个Windows框,到目前为止我已经能够成功部署和运行我的webapp而没有任何问题。我通过转到网址访问该网站:http://localhost:8080/appname

现在,我的angular应用程序的$ stateProvider正确加载默认状态(以便URL变为http://localhost:8080/appname/#/login)。

我现在部署到我们的测试环境,这是一台linux机器(同样的tomcat7)。当我现在去网址时:http://test-box:8080/appname 它改为:http://test-box:8080/appname#/

注意" appname"之后缺少的尾部斜杠。只加载空白页面。虽然我倾向于后者,但我不知道问题可能在哪里,tomcat或有角度。

1 个答案:

答案 0 :(得分:0)

所以我从来没有弄清楚为什么这只发生在我的测试环境中,但我确实设法解决了这个问题。我做了以下事情:

  1. 为角度应用启用html5模式:

    $locationProvider.html5Mode({
        enabled: true,
        requireBase: true
    });
    

    我将requireBase视为'true',因为正如我上面提到的,webapp有一个appName,它引导我进入第2点。

  2. 要确保您的角度应用可以使用您的基本应用名称,请将其添加到您的主index.html文件中:

    <base href="/appName/">
    

    确保在<head>标记

  3. 的顶部完成此操作
  4. 上面解决了我的问题,但又引入了一个新问题。由于html5模式,您将不再在您的网址中看到#。现在,当您刷新页面时,由于URL现在完全由角度管理,因此服务器可能不知道如何处理您尝试访问的资源。它甚至可能不存在于服务器端,你将获得404.所以,如果你刷新页面并尝试访问服务器不知道的任何东西(在我的例子中,任何以appName / api开头的东西,appName / resourc等等都可以)它应该被重定向到index.html。这意味着您需要重写URL。不幸的是,tomcat7不支持这个,所以我不得不升级到tomcat8。也可以在apache前端服务器上配置URL重写。如果能够这样做,在tomcat8中启用conf/server.xml中的URL重写:

    <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">
    
        <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
    

    然后创建一个名为conf/rewrite.config的新文件,其中包含:

    RewriteCond %{REQUEST_URI} ^/appName/(api|resource).*$
    
    RewriteRule ^.*$ - [L]
    RewriteRule ^.*$ /appName/index.html [L,QSA]
    

    这表示以api/*resource/*开头的所有内容都可以,其他所有内容都必须重定向到index.html