Thymeleaf将应用程序上下文添加到apache代理后面的app的URL

时间:2016-09-26 22:48:24

标签: apache tomcat spring-boot thymeleaf

所以我在网络应用中如何生成网址时遇到了一些问题。

我的'demo'springboot app在我的服务器上部署为'demo.war'(扩展到'demo'文件夹)。我还有一个apache子域,配置为将demo.myserver.com映射到tomcat上的正确上下文:

<VirtualHost *:80>
  ServerAdmin admin@myserver.com
  ServerName demo.myserver.com

  ProxyRequests Off
  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>
  ProxyPass / ajp://localhost:8009/demo/
  ProxyPassReverse / ajp://localhost:8009/demo/
</VirtualHost>
到目前为止一切顺利。当我转到http://demo.myserver.com时,它将传递到tomcat中的'demo'上下文并加载页面。问题在于如何创建页面中的上下文相关URL。最终相关生成的HTML如下所示:

<form action="/demo/loadDataSet" method="get">
  <button type="submit">Load next dataset</button>
</form>

百万美元模板位看起来像这样:

<form th:action="@{/loadDataSet}" method="get">
  <button type="submit">Load next data set</button>
</form>

点击此按钮后,使用的网址为http://demo.myserver.com/demo/loadDataSet,因为我的'demo'子域中没有'demo'上下文的映射,因此失败了404。我想知道的是如何生成html所以它看起来像这样:

<form action="/loadDataSet" method="get">
  <button type="submit">Load next dataset</button>
</form>

谢谢你们

2 个答案:

答案 0 :(得分:1)

所以我不得不自己深入研究一下。事实证明,Thymeleafs首先不对这个问题负责。这是我的apache配置问题(我现在应该更改问题的标题吗?)毕竟。

这是我提出的apache的配置:

ProxyHTMLURLMap

此处的关键是/demo/行,其中传递了HTML中/的所有引用,并将其替换为ProxyHTMLURLMap<Location>只能使用/标记,其中proxy_html未标记标记的关闭,而是标记要映射的路径/上下文。在我的例子中,演示子域中的根。

proxy_html.conf模块的配置也存在问题。无论出于何种原因# Here's the declaration for W3C HTML 4.01 and XHTML 1.0 ProxyHTMLLinks a href ProxyHTMLLinks area href ProxyHTMLLinks link href ProxyHTMLLinks img src longdesc usemap ProxyHTMLLinks object classid codebase data usemap ProxyHTMLLinks q cite ProxyHTMLLinks blockquote cite ProxyHTMLLinks ins cite ProxyHTMLLinks del cite ProxyHTMLLinks form action ProxyHTMLLinks input src usemap ProxyHTMLLinks head profile ProxyHTMLLinks base href ProxyHTMLLinks script src for # To support scripting events (with ProxyHTMLExtended On), # you'll need to declare them too. ProxyHTMLEvents onclick ondblclick onmousedown onmouseup \ onmouseover onmousemove onmouseout onkeypress \ onkeydown onkeyup onfocus onblur onload \ onunload onsubmit onreset onselect onchange 都丢失了,所以我必须自己创建它并将其添加到内部:

!important

在我尝试解决方案时,我使用了来自hereherehere的示例。希望它对其他人也有帮助。

答案 1 :(得分:0)

您是否尝试过添加

ProxyPreserveHost On

我并不熟悉,但似乎在这样的问题中建议:

Why does getContextPath() under a proxy return the internal path inside HttpServlet but not inside Filter?

另一种选择是这样的:

<form action="@{~/loadDataSet}" method="get">
  <button type="submit">Load next dataset</button>
</form>

哪个是服务器相对网址。