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

Angular 未找到页面时更改tomcat的行为(404),angular,tomcat,http-status-code-404,Angular,Tomcat,Http Status Code 404,有人能给出一个关于如何配置Tomcat以完全避免404的建议吗?相反,当找不到页面时(特别是在应该触发404的情况下),返回index.html内容和200作为状态? 让我告诉你我为什么要这么做: 我们有一个角度应用程序“www.app.exmpl/app”,当用户点击“www.app.exmpl/app”时,应用程序正确显示并返回200。返回的index.html包含角度应用程序代码 当用户点击“www.app.exmpl/app/some_unexisted_url_in_file_syst

有人能给出一个关于如何配置Tomcat以完全避免404的建议吗?相反,当找不到页面时(特别是在应该触发404的情况下),返回index.html内容和200作为状态? 让我告诉你我为什么要这么做:

  • 我们有一个角度应用程序“www.app.exmpl/app”,当用户点击“www.app.exmpl/app”时,应用程序正确显示并返回200。返回的index.html包含角度应用程序代码

  • 当用户点击“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
    
  • 这会导致用户收到404响应,但web应用程序仍会加载 正确,因为index.html中有angular应用程序和加载后页面 将url重写为合适的url,如:“www.app.exmpl/app”

  • 当用户点击“www.app.exmpl/app/url_handled_by_angular_app”时,仍然没有找到“url_handled_by_angular_app”下的页面或端点,因此tomcat将代码设置为404并呈现index.html,返回给用户,并且在用户的pc上,该响应呈现为angular app,而无需重新编写url,因为angular app知道如何处理“url由应用程序处理”路线

  • 总而言之,我只需要去掉404,用200替换它们,在这种情况下只渲染index.html内容。对于这种情况,什么是最佳做法?

    您能提供更多有关
    路由策略的详细信息吗。
    我想你必须使用这个
    {useHash:true}

    如果您没有使用
    {useHash:true}
    并在重新加载时搜索URL路径中的特定文件,则可能会出现这种情况,
    当错误页面不是静态页面,而是JSP页面(或Servlet)时,您可以在此处找到更多信息(
    response.setStatus(200)
    ),并为静态文件提供服务(转发或包含)


    虽然我想在像您这样的用例中,使用
    302
    (客户端重定向)响应更合适,比如
    response.sendRedirect(application.getContextPath()+“/index.html”)

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

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

  • 在server.xml中配置重写阀
  • 在rewrite.config中写入重写规则
  • 1.在server.xml中配置重写阀

    编辑~/conf/server.xml以在主机部分中添加以下阀门,如下所示-

    ...
          <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
    
            <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
    
    ...
          </Host>
    ...
    
    设置此选项后,重新启动tomcat服务器,您可以点击应用程序的深层链接,该链接将路由到angular应用程序中的正确组件


    有关更多详细信息,请参阅。

    如何在tomcat上修复404?@Pavel请分享您的路由文件内容。事实上,您是对的,使用HashLocationStrategy是最佳做法。谢谢。PathLocationStrategy优先于HashLocationStrategy。Ref重定向所有“虚拟”指向index.html的url将使angular应用程序无法正常工作,因为它将无法处理angular提供的路由,因为路由将在重定向过程中被切断。Abhishek为此线程的主题提供了正确的解决方案,另一种解决方案是将应用程序的url模式映射到呈现index.html,而无需重新编写url,这将使路由处理成为可能。但我个人更喜欢HashLocationStrategy,因为它让我避免了使用mapping.Wow进行不必要的服务器端配置。感谢您的详细解释。:)这是一种困难的方式…不要认为应该使用它来解决我遇到的问题…对于您的第3点-当用户点击URL
    www.app.exmpl/app/url\u handled\u by\u angular\u app
    ,您希望服务器返回
    index.html
    。这是由重写规则设置的,该规则表示,如果url包含任何具有上下文路径
    /app/*
    的内容,则返回index.html。从那里,angular routing将接管并返回该路径的相应组件。
    RewriteCond %{REQUEST_PATH} !-f
    RewriteRule ^/app/(.*) /app/index.html