2012-06-10 2 views
3

Я экспериментировал с написанием webapps в Clojure, и до сих пор это было довольно легко. Я следил за превосходным скринкастом Chas Emerick starting clojure и быстро и быстро запустил укороченный переводчик. Затем я хотел иметь возможность развернуть его, и вот тогда началось беда.Неработающие ссылки при развертывании Clojure webapps на Jetty с относительными ссылками и корневым контекстом path

Когда я запускаю его в разработке или развертываю на Jetty в качестве корневого webapp, все в порядке, но когда я его развертываю с помощью контекстного пути, это не так. Или, скорее, он почти работает. Все мои маршруты 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. При развертывании на Jetty с контуром /example все работает нормально, пока я не запускаю форму submit. Затем Джетти жалуется, что не может найти localhost:8080/shorten, что означает (я думаю), что он не рассматривается как относительный путь, а абсолютный.

Итак, мой вопрос: как это исправить? Думаю, я мог бы просто указать полный путь в ссылке на действие, но это было бы негибким и усложняло бы запуск сервлета в процессе разработки. Есть ли способ настроить мой выход из этого? Или какой-то магический URL-префикс (например, ~/ в Razor), который будет делать правильные вещи?

+0

Вы доступ к этой форме из/например? Поскольку это относительный путь в вашем действии, ваш браузер должен добавить его с вашим текущим URI. Возможно, загрузите Firebug или какой-нибудь HTTP-инспектор и посмотрите, получаете ли вы перенаправление. – mqsoh

+0

Да, я обращаюсь к нему из примера ... и файл css в обслуживается корректно (через перенаправление 304), но действие

не выполняется. – corvuscorax

+0

Когда вы нажимаете кнопку «Отправить», вы видите какие-либо переадресации на запросы страниц? ... как 301 из примера/сократить/сократить? – mqsoh

ответ

0

У меня была та же проблема. Изменить строку:

(POST "/shorten" request 

к

(POST "shorten" request 

и он должен работать (ну, это было для меня)