反向代理后面的Thymeleaf模板(在Spring启动应用程序中)没有正确形成url

时间:2017-05-17 10:46:53

标签: spring tomcat nginx proxy thymeleaf

在反向代理服务器后面的服务器上使用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配置中添加一些内容,但我不确定究竟是什么。

2 个答案:

答案 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'