角深链接 - apache tomcat



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

当用户直接尝试访问链接domain.com/hris/term时,它将带有消息返回404: HTTP Status 404 - /hris/term

我不希望404发生。如何完成此操作?

到目前为止我所做的事情:

我尝试在index.html所居住的文件夹中创建一个.htaccess文件。(我使用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>

我正在使用Angular5。请让我知道我的方法是正确的,还是我要做的才能实现这一目标。

版本:Apache Tomcat 7-版本7.0.64

; htaccess; quot;文件在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。

update

为什么重写

  • 由于Angular Apps是SPAS,完全解决的唯一真实页面是index.html
  • 因此,任何诸如href之类的链接都会离开该页面并退出应用程序。
  • Angular使用其路由器将其重定向到应用程序内的虚拟路径,而无需离开index.html
  • Web服务器会猜测这些路径是真实的文件,并且由于它们不存在,因此使用404 HTTP状态响应(如果tomcat的情况下,其默认服务器服务为静态内容(。
  • 解决此问题可以使用URL重写。

如何启用重写

  • 首先,您需要启用RewriteValve,它是网络过滤器,默认情况下是禁用的。为此,您可以像上面的示例(Portable版本(中将context.xml添加到Angular Build文件中,或将其添加到server.xml(服务器端版本(中。请参阅上面的代码段。
  • 之后,添加一个rewrite.conf文件以设置重写条件。请参阅上面的代码段。
  • 在上面的示例中,第一行告诉Tomcat寻找"不是真实/现有文件"的"文件"!-f,在当前的servlet路径中。servlet路径部分是必要的,如果您的应用程序未部署为ROOT(即www.xyz.com/demymyappdyder(,并将相应地设置。
  • 第二行mapp将每个"虚拟路径"绘制;从角路由器到index.html。

更新2

  • 启用服务工人也可以解决问题。

用于在Apache Tomcat服务器上部署Anglocation Application(使用PathLocationsTrategy路由(时修复深链路问题(8,9( -

  1. 在server.xml中配置rewriteValve
  2. 在rewrite.config
  3. 中写下重写规则

server.xml-

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

rewrite.config-(注意 -/Hello/是Tomcat上Angular App的上下文路径(

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

我已经在我的文章中记录了这一点 - 修复了深层链接问题 - 在Tomcat Server上部署Angular应用程序

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

我没有足够的代表对他的答案发表评论,因此我将在这里重申以确保完整性:

将重写配置放入文件web-inf/rewrite.config,也许是这样:

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。

最新更新