使用相对链接和非根上下文路径将Clojure webapps部署到Jetty时链接断开

使用相对链接和非根上下文路径将Clojure webapps部署到Jetty时链接断开,clojure,jetty,compojure,ring,enlive,Clojure,Jetty,Compojure,Ring,Enlive,我一直在尝试用Clojure编写网络应用程序,直到现在都很容易。我跟随查斯·埃默里克的精彩屏幕,找到了一个网址缩短器,并且运行得很快。接下来,我希望能够部署它,而这正是问题开始的时候 当我在开发中运行它或将它作为根webapp部署到Jetty时,一切都很好,但当我使用上下文路径部署它时,情况就不一样了。或者,更确切地说,它几乎奏效了。我所有的Compojure路由仍然有效,但是HTML文件中的FORMaction链接被破坏,给我404的 这是Compojure路由设置: (defroutes

我一直在尝试用Clojure编写网络应用程序,直到现在都很容易。我跟随查斯·埃默里克的精彩屏幕,找到了一个网址缩短器,并且运行得很快。接下来,我希望能够部署它,而这正是问题开始的时候

当我在开发中运行它或将它作为根webapp部署到Jetty时,一切都很好,但当我使用上下文路径部署它时,情况就不一样了。或者,更确切地说,它几乎奏效了。我所有的Compojure路由仍然有效,但是HTML文件中的
FORM
action链接被破坏,给我404的

这是Compojure路由设置:

  (defroutes app*
    (rt/resources "/")
    (GET "/" request (homepage request))
    (POST "/shorten" request
          (let [id (shorten (-> request :params :url))]
            (response/redirect "/")))
    (GET "/:id" [id] (redirect id)))

  (def app (compojure.handler/site app*))
以下是主页模板的HTML:

<!DOCTYPE html>
<html>
<head>
    <title>Insert title here</title>
    <link type="text/css" rel="stylesheet" href="site.css" />
</head>
<body>
    <form method="POST" action="shorten">
        <input type="text" name="url" />
        <input type="submit" value="Shorten!" />
    </form>
</body>
</html>

在此处插入标题
问题在于
action=“shorten”
URL。当使用
/example
的上下文路径部署到Jetty时,一切正常,直到触发表单提交。然后Jetty抱怨它找不到
localhost:8080/shorten
,这意味着(我认为)它没有被视为相对路径,而是绝对路径


所以,我的问题是:如何解决这个问题?我想我可以在action链接中指定完整的路径,但这将是不灵活的,并且使得在开发中运行servlet更加困难。有没有办法配置我的解决方法?或者是一些神奇的URL前缀(比如Razor中的
~/
),它们只会做正确的事情?

我也有同样的问题。更改行:

(POST "/shorten" request


它应该可以工作(对我来说是这样的)

您是从/example访问该表单的吗?因为它是您操作中的一个相对路径,所以您的浏览器应该在它前面加上您当前的URI。也许加载Firebug或一些HTTP检查器,看看是否得到重定向。是的,我从/example访问它。。。中的css文件被正确送达(通过304重定向)-但操作不是。当您单击“提交”时,是否看到页面请求的重定向。。。像301 from/example/shorten to/shorten?不,触发表单操作不会导致重定向-只是简单的GET to/shortenIt的尾部斜杠。如果您转到/example/则表单将发布到/example/shorten。如果没有尾随斜杠,浏览器会将“示例”视为/处的文件,并将表单视为需要“缩短”而不是“示例”。不过,我不知道如何在你的情况下解决这个问题。在我以前的经验中,我已经为后面的斜杠设置了重定向,事实上,当为文本目录请求提供服务时,默认情况下Apache将发送这些重定向。
(POST "shorten" request