我有一个为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
答案 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";
}
}
}