在反向代理服务器后面的服务器上使用Thymeleaf时,我很难正确地形成相对URL(在我的情况下是nginx)。
假设我在nginx中有以下位置:
location /app {
proxy_pass http://10.0.0.0:8080;
}
我有以下Thymeleaf 3页面(index.html
):
<html xmlns:th="http://www.thymeleaf.org">
<head>
<link rel="stylesheet" th:href="@{/css/some.css}" />
</head>
<body>
Hello world!
</body>
</html>
使用的服务器是嵌入式Tomcat服务器(Spring引导),在上下文/
运行。
当我向http://example.com/app
发送请求时,我会将index.html
页面作为回复。但是,无法检索css,因为当在Thymleaf模板中构造URL时,它使用tomcat服务器的上下文路径,即/
。 index.html
中构建的网址如下所示:
http://example.com/css/some.css
这显然导致找不到404。 URL需要按如下方式形成:
http://example.com/app/css/some.css
我需要配置什么才能让Thymeleaf将网址格式化为http://example.com/app/css/some.css
?我宁愿不对某些配置文件或其他类似的基本URL进行硬编码。我想我需要在nginx配置中添加一些内容,但我不确定究竟是什么。
答案 0 :(得分:1)
最终使Tomcat服务器的上下文与所需的Nginx位置匹配。根据上面的示例,上下文将设置为“ / app”。
编辑:
我在application.yml
中设置了应用程序上下文属性:
server:
servlet:
contextPath: /app
答案 1 :(得分:0)
正确的解决方案是通知springboot应用程序它在代理之后。
尝试将nginx配置扩展为如下所示:
location /app {
proxy_pass http://10.0.0.0:8080;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Prefix /app;
}
要了解有关使用转发标头(标准几年)的信息,请查看https://www.nginx.com/resources/wiki/start/topics/examples/forwarded/ 春季文档中对此主题有些误解,您可以查看一些问题/项目以获得更多信息:
PS:如果您正在测试springboot应用程序配置,则可以使用cURL在本地进行配置,而无需使用nginx。要模拟请求标头(例如从代理来),可以使用以下命令:
curl -i http://localhost:8080 \
-H 'X-Forwarded-Host: example.com' \
-H 'X-Forwarded-Port: 443' \
-H 'X-Forwarded-prefix: /myDevelApp' \
-H 'X-Forwarded-proto: https'
或使用标准化标题:
curl -i http://localhost:8080 \
-H 'X-Forwarded-prefix: /myDevelApp' \
-H 'Forwarded: for=123.333.333.333;host=example.com;proto=https'