2

我有一个在本地(在 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 上会发生这种情况,我该如何修复它(除了硬编码 URLS)?

4

2 回答 2

2

WAR 文件部署到 Heroku时,WAR 文件使用Webapp Runner启动,它只是 Tomcat 的一个薄包装器,允许它从命令行轻松运行。在当前部署的 Webapp Runner 版本中,默认上下文路径是/,这是额外斜杠的来源。要将路径设置为其他内容(包括空字符串),您可以使用--path参数。要为使用 WAR 部署的 Heroku 应用程序设置此项,您可以WEBAPP_RUNNER_OPTS像 thisr 一样在 config var 中设置它:

heroku config:add WEBAPP_RUNNER_OPTS="--path ''"
于 2013-03-27T07:56:03.967 回答
1

为了补充 ryanbrainard 所说的话,以防有人遇到我遇到的同样的麻烦。我发现在部署时尝试在命令行设置此标志没有效果,可能是因为我在执行 git push 时进行部署,而不是使用命令行部署战争。

我必须在我的项目中更新 /Procfile 并在那里添加选项。所以我的看起来像: web: java $JAVA_OPTS -Dspring.profiles.active=prod -jar target/dependency/webapp-runner.jar --port $PORT --path '' target/*.war

这为我解决了这个问题。

于 2014-04-07T22:07:30.720 回答