与nginx的try_files等效的Spring MVC

c3frrgcw  于 2022-11-14  发布在  Spring
关注(0)|答案(2)|浏览(200)

我有一个Tomcat服务器,它正在为Spring MVC应用程序提供服务。
我想为某个路径实现一个静态servlet,并希望它的行为等同于nginx try_files指令:

...
root /my/path/to/app

location /app {
  try_files $uri $uri/ /index.html;
}
...

对于那些不熟悉nginx的人:
我希望servlet将/app路径直接Map到/webapp/app目录。如果它在目录中找到与请求匹配的静态文件,很好,返回该内容。否则返回/webapp/app/index.html文件。
例如,如果我的目录如下所示:

/webapp
    /app
        index.html
        existing-file.js
        /sub-dir
            file.js

那么......

mydomain.com/app                     returns    /webapp/app/index.html
mydomain.com/app/index.html          returns    /webapp/app/index.html
mydomain.com/app/non-existant-file   returns    /webapp/app/index.html
mydomain.com/app/existing-file.js    returns    /webapp/app/existing-file.js
mydomain.com/app/sub-dir/file.html   returns    /webapp/sub-dir/file.html
c8ib6hqw

c8ib6hqw1#

从Spring应用程序服务VueJS前端也有同样的问题。我使用HTML5历史模式,所以URI可以包含一些由前端管理的路径。Spring应用程序只服务/api/**端点。
AFAIK,try_files没有直接等效项。
基本的想法是创建额外的Map,在任何请求到“前端”路径时返回“index.html”。我不知道如何为/**创建Map并给予它最低的优先级-这是与nginx的主要区别,nginx选择最具体的匹配规则。
因此,我创建了一个Map,它符合除/api/**/js/**/css/**/fonts/**和index.html本身之外的所有路径。

@Configuration
public class StaticConfig extends WebMvcConfigurerAdapter {

  @Controller
  static class Routes {
    @RequestMapping(
     value = "{_:^(?!index\\.html|api|css|js|fonts).*}/**",
     method = RequestMethod.GET)
    public String index() {
      return "/index.html";
    }
  }
}
wlwcrazw

wlwcrazw2#

我认为最接近try_files的是让Sping Boot 尝试为文件提供服务,但如果找不到,则会提供一个错误页面,该页面可以重定向到其他页面,例如:index.html

/**
 * Redirects errors (including 404) to the index.html .
 */
@Controller
public class ErrorHandlerController implements ErrorController {

    /**
     * error handling.
     * 
     * @return home controller
     */
    @RequestMapping("/error")
    @ResponseStatus(HttpStatus.OK)
    public String error() {
        return "tools/liquidbeta/index.html";
    }

}

相关问题