私は Clojure で Web アプリケーションを作成する実験を行ってきましたが、これまでは非常に簡単でした。私は Chas Emerick の優れたスクリーンキャストに従って clojureを開始し、URL 短縮サービスをすぐに実行できるようにしました。次に、それを展開できるようにしたかったのですが、それが問題の始まりでした。
開発で実行するか、ルート Web アプリケーションとして Jetty にデプロイすると、すべて問題ありませんが、コンテキスト パスを使用してデプロイすると、うまくいきません。というか、ほとんど効きます。すべての Compojure ルートは引き続き機能FORM
しますが、HTML ファイル内のアクション リンクが壊れており、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 にデプロイすると、正常に動作します。localhost:8080/shorten
次に、Jetty は、それが相対パスとしてではなく絶対パスとして扱われていることを意味する (私が思うに)見つけられないと不平を言います。
だから、私の質問は次のとおりです。これを修正するにはどうすればよいですか?アクション リンクでフル パスを指定することもできると思いますが、それでは柔軟性がなくなり、開発中のサーブレットの実行が難しくなります。これから抜け出す方法を設定する方法はありますか? ~/
または、正しいことを行うだけの魔法の URL プレフィックス (Razor など) はありますか?