一尘不染

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

spring-boot

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


X在其位置服务中使用HTML5模式。这意味着,您将看到类似www.example.com/mail的URL,而不是看到类似这样的URL: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.不是rest api控制器的路径AND B.不能解析为其中的静态资源(在我的情况下为“静态”资源文件夹)。

那么,我需要创建自定义资源处理程序/自定义过滤器吗?也许问题出在不同的维度上?(tomcat本身?)


阅读 373

收藏
2020-05-30

共1个答案

一尘不染

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

答:必须由angular js解析的路径与backed->的含义无关,后端不知道angular知道哪些路径,哪些不知道。

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的请求(针对错误的休息api路径)将接收index.html,但是状态已设置,因此应该没什么大不了的。

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

2020-05-30