找不到页面时更改tomcat的行为(404)

时间:2018-10-18 04:59:26

标签: angular tomcat http-status-code-404

任何人都可以就如何配置Tomcat从而避免使用404提供建议,而是在找不到页面时(特别是在应触发404的情况下)返回index.html内容和200作为状态吗? 让我告诉你我为什么要这样做:

  1. 当用户点击“ www.app.exmpl / app”应用后,我们正确地显示了角度应用程序“ www.app.exmpl / app”并返回了200。返回了带有角度应用代码的index.html。

  2. 当用户点击“ www.app.exmpl / app / some_unexisted_url_in_file_system_path”时,tomcat会尝试查找可以提供此url的终结点或html文件,并返回404,并且在web.xml中,我们具有以下配置:

    <error-page>
     <error-code>404</error-code>
     <location>/index.html</location>
    </error-page>
    

这会导致用户收到404响应,但仍然会加载网络应用 正确,因为index.html中和加载页面后都包含有角度的应用程序 将网址改写为正确的网址,例如:“ www.app.exmpl / app”。

  1. 当用户点击“ www.app.exmpl / app / url_handled_by_angular_app”时,仍找不到“ url_handled_by_angular_app”下的页面OR端点,因此tomcat将代码设置为404并呈现index.html,并返回给用户,并且在用户的PC上,此响应将呈现为有角度的应用程序,而无需重写URL,因为有角度的应用程序知道如何处理“ url_handled_by_angular_app”路由。

因此,总而言之,我只需要摆脱404并将其全部替换为200并在这种情况下仅呈现index.html内容。这种情况下的最佳做法是什么?

3 个答案:

答案 0 :(得分:2)

没有服务器上的重定向规则,应用程序深层链接将无法工作。服务器必须将所有深层链接重定向到应用程序index.html

设置tomcat以重定向任何深层链接-

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

1。在server.xml中配置RewriteValve

编辑〜/ conf / server.xml以在主机部分中添加以下Valve,如下所示–

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

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

...
      </Host>
...

2。将重写规则写入rewrite.config

创建目录结构–〜/ conf / Catalina / localhost /并使用以下内容在其中创建rewrite.config文件。注意-在这里,我考虑将/app作为问题中提到的应用程序的上下文路径。

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

设置完成后,重新启动tomcat服务器,您可以单击应用程序的深层链接,这些链接将路由到angular应用程序内的正确组件。

您可以参考this post以获得更多详细信息。

答案 1 :(得分:0)

当错误页面不是静态页面,而是JSP页面(或Servlet)时,它可以更改响应状态(response.setStatus(200))并提供静态文件(转发至静态文件或包括静态文件)。 / p>

尽管我猜想在像您这样的用例中,使用302(客户端重定向)响应(如response.sendRedirect(application.getContextPath() + "/index.html"))更合适。

答案 2 :(得分:-2)

您能否提供有关您的Routing Strategy的更多详细信息。 好吧,我想您必须使用此{useHash: true}

这可能是一种情况,如果您没有使用{useHash: true},并且在重新加载它时搜索URL路径中的特定文件, 您可以在https://thinkster.io/tutorials/angular-2-routing-navigation

中找到更多信息