Angular 未找到页面时更改tomcat的行为(404)
有人能给出一个关于如何配置Tomcat以完全避免404的建议吗?相反,当找不到页面时(特别是在应该触发404的情况下),返回index.html内容和200作为状态? 让我告诉你我为什么要这么做: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
<error-page>
<error-code>404</error-code>
<location>/index.html</location>
</error-page>
404
/index.html
总而言之,我只需要去掉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点-当用户点击URLwww.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