如果请求映射未解析且在静态资源位置找不到路径,则重定向到index.html

时间:2015-12-31 22:03:41

标签: spring-boot

问题(由前端,angularjs上下文引起):

“X在其位置服务中使用HTML5模式。这意味着,您会看到像www.example.com/mail这样的网址,而不是看到这样的网址:www.example.com /#/ mail

此外,如果不遵循.htaccess规则,则无法直接访问您的应用程序。因此,在网址栏中输入www.example.com/mail或刷新应用程序将导致内部服务器错误。

创建一个与index.html保持同一目录的.htaccess,并将以下代码粘贴到其中:“

 <IfModule mod_rewrite.c>
        RewriteEngine On
        # Send all requests to the index.html unless
        # it's a directory or a file that actually exists
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ index.html [L]
 </IfModule>

当我使用tomcat时,这个脚本和伪代码一样有用,它必须放在Spring Boot应用程序中。否则浏览器中没有任何直接键入的路径工作(获取404白标服务器页面)。

有效地我需要实现类似的东西。我甚至无法弄清楚我应该看哪些组件。

到目前为止,我的大脑中存在脱节的信息:

  • 来自过滤器链和资源处理程序的Spring过滤器按我提到的顺序命中(根据跟踪日志)。
  • 每当路径为:我需要重定向到index.html: A.不是休息api控制器路径AND B.未解析为静态资源(在我的情况下:'静态'资源文件夹)。

那么我需要创建自定义资源处理程序/自定义过滤器吗?或者问题可能在于不同的维度? (tomcat本身?)

1 个答案:

答案 0 :(得分:3)

这个问题比技术更合乎逻辑:

一个。必须通过角度js解决的路径与后备无关 - &GT;意思是,后端不知道角度知道哪些路径,哪些路径不知道。

B中。因此,如果资源未被控制器和资源处理程序解析 - 这是后端的404情况。所以:

@Component
public class WebConfiguration implements EmbeddedServletContainerCustomizer {
    @Override
    public void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) {
        configurableEmbeddedServletContainer.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/index.html"));
    }
}

解决了这个问题。结果是,每当我们转到/mail,后端返回index.html,然后angular解析内部路径并显示电子邮件部分。多么棱角分明我不确定自己,我不知道html5模型如何记住这条道路。

此解决方案的不足之处是请求停止api,定位错误的rest api路径将收到index.html,但状态已设置,所以应该没什么大不了的。

但是很高兴知道后端流程中的哪一点知道请求既没有解析到控制器也没有解析为静态资源以及如何捕获这种行为。