角度深度链接 - Apache Tomcat

时间:2018-04-26 15:23:57

标签: angular apache tomcat deep-linking

我正在构建一个Angular应用。它以h /hris为基础托管。因此,我访问该应用的基本网址为domain.com/hris。此外,我有3个不同的应用程序,其中一个称为term。因此,当我点击term链接时,会转到domain.com/hris/term。

当用户直接尝试访问链接domain.com/hris/term时,会返回404并显示一条消息:HTTP Status 404 - /hris/term

我不希望发生404。怎么做到这一点?

到目前为止我做了什么:

我尝试在.htaccess所在的文件夹中创建index.html文件。(我使用ng build --base-href=/hris/构建了Angular应用程序)。我将dist文件夹部署到名为hris的目录中的服务器。

.htaccess文件中,我使用了以下变体,但没有用。

1

    <IfModule mod_rewrite.c>
          Options Indexes FollowSymLinks
          RewriteEngine On
          RewriteBase /hris/
          RewriteRule ^index\.html$ - [L]
          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteCond %{REQUEST_FILENAME} !-d
          RewriteRule . index.html [L]
    </IfModule>

2

    <IfModule mod_rewrite.c>
       Options Indexes FollowSymLinks
       RewriteEngine On
       RewriteRule ^index\.html$ - [L]
       RewriteCond %{REQUEST_FILENAME} !-f
       RewriteCond %{REQUEST_FILENAME} !-d
       RewriteRule . /index.html [L]
    </IfModule>

3

    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{REQUEST_FILENAME} -s [OR]
        RewriteCond %{REQUEST_FILENAME} -l [OR]
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule ^.*$ - [NC,L]
        RewriteRule ^(.*) index.html [NC,L]
   </IfModule>

我正在使用Angular 5.请告诉我,如果我的方法是正确的,或者我必须做些什么才能实现这一目标。

版本:Apache Tomcat 7-版本7.0.64

3 个答案:

答案 0 :(得分:1)

&#34; htaccess的&#34;文件在Tomcat上不起作用。将重写配置放入文件WEB-INF/rewrite.conf,可能是这样的:

RewriteCond %{SERVLET_PATH} !-f
RewriteRule ^/(.*)$ /index.html [L]

接下来,你需要添加一个名为META-INF/context.xml的文件来启用重写,即:

<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true" tldValidation="false" xmlValidation="false">

  <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

</Context>

同时从Angular应用中删除HashLocationStrategy

答案 1 :(得分:1)

在尝试解决类似问题时,我偶然发现了这个问题。 Stefan的答案对我有用,但对文件名稍作修改。对于https://tomcat.apache.org/tomcat-9.0-doc/rewrite.html,重写配置文件应命名为rewrite.config(不是rewrite.conf )。

我没有足够的代表对他的回答发表评论,因此我在这里重申其完整性:

将重写配置放入文件WEB-INF / rewrite.config中,也许像这样:

var arr = [[1, ], [2], [3]];
var product = 1;

for (var i = 0; i < arr.length; i++) {
  product = i; //output: 2 (which makes sense)
};

接下来,您需要添加一个名为META-INF / context.xml的文件,该文件可以进行重写,即:

for (var i = 0; i < arr.length; i++) {
  product += i; //output: 4 (shouldn't the output 3?)
};

还要从Angular应用中删除HashLocationStrategy。

答案 2 :(得分:0)

用于解决在Apache Tomcat服务器(8,9)上部署角度应用程序(使用PathLocationStrategy路由)时的深层链接问题-

  1. 在server.xml中配置RewriteValve
  2. 在rewrite.config中写入重写规则

server.xml-

...
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

...
      </Host>
...

rewrite.config-(注意-/ hello /是tomcat上的角度应用程序的上下文路径)

RewriteCond %{REQUEST_PATH} !-f
RewriteRule ^/hello/(.*) /hello/index.html

我已经在我的文章中对此进行了记录-Fixing deep linking issue – Deploying angular application on Tomcat server