我有一个简单的应用程序,已在本地(Tomcat 中)以及 Google App Engine 和 Heroku 上部署。
该应用程序使用 JSTL 标签,它们在所有部署中都可以正常工作,除了 URL 标签 ( <c:url value="/someUrl"/>
),该标签仅在 Heroku 上前置一个额外的正斜杠,这会搞砸一切。这就是我的意思:
<c:url value='/laundryLists/search.htm'/>
在我的本地 Tomcat 中,应用程序是使用“testApp”上下文部署的,上面的代码片段将在页面中生成以下字符串:
“/testApp/laundryLists/search.htm”
这是正确的。
在我的 GAE 部署的应用程序(位于地址 testApp.appspot.com)中,上面的代码片段生成:
“/laundryLists/search.htm”
这是正确的,因为这里的应用程序上下文是“/”(根)
在我的 Heroku 版本中,部署在“testApp.herokuapp.com”
完全相同的代码生成:
“//laundryLists/search.htm”(注意开头有两个正斜杠)
这是错误的,因为如果放在链接中,例如
<a href="<c:url value='/laundryLists/search.htm'/>">whatever</a>
链接 URL 为:
http://laundryLists/search.htm
这显然是错误的。
值得一提的是,其他 JSTL 标签(例如“forEach”)在 Heroku 中也能正常工作。
所以我的问题是,为什么 Heroku 上会发生这种情况,我该如何修复它(除了对 URL 进行硬编码之外)?
最佳答案
何时 deploying WAR files to Heroku ,WAR 文件以 Webapp Runner 启动,它只是 Tomcat 的一个薄包装,允许它从命令行轻松运行。在当前部署的 Webapp Runner 版本中,默认上下文路径是 /
,这是额外斜杠的来源。要将路径设置为其他内容(包括空字符串),可以使用 --path
参数。要使用 WAR 部署为 Heroku 应用程序设置此项,您可以在 WEBAPP_RUNNER_OPTS
配置变量中进行设置,如下所示:
heroku config:add WEBAPP_RUNNER_OPTS="--path ''"
关于java - JSTL URL 标签在 Heroku 上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13790720/