Spring MVC相当于nginx的try_files

时间:2017-02-19 19:27:17

标签: spring-mvc nginx

我有一个为Spring MVC应用程序提供服务的Tomcat服务器。

我想为某个路径实现一个静态servlet,我希望它能在一个与nginx try_files指令相当的庄园中运行:

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

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

对于那些不熟悉nginx的人:

我希望servlet将/app路径直接映射到/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

2 个答案:

答案 0 :(得分:0)

通过连接root参数和URI来构造本地路径。因此,/app已经在URI中,并且未显示在root中。您的问题不清楚root是否具有正确的值。如果这与其他location块的根冲突,则root语句可以在此location块内未经修改地移动。有关详情,请参阅this document

try_files语句的最后一个元素是默认操作(URI或响应代码)。在您的情况下,您需要index.html文件的URI,即/app/index.html。有关详情,请参阅this document

root /webapp;

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

答案 1 :(得分:0)

从Spring应用程序提供VueJS前端时遇到相同的问题。 我使用HTML5历史记录模式,因此URI可以包含一些由前端管理的路径。 Spring应用程序仅服务/api/**个端点。

AFAIK,没有直接等效于try_files的文件。

基本思想是创建其他映射,该映射将在对“前端”路径的任何请求上返回“ index.html”。 我不知道为/**创建映射并为其赋予最低优先级的方法-这是与nginx的主要区别,后者选择了最具体的匹配规则。

因此,我创建了一个映射,该映射符合/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";
    }
  }
}