2012-06-10 5 views
3

저는 Clojure에서 웹 응용 프로그램을 작성하는 실험을 해왔으며 지금까지는 매우 쉽습니다. 나는 Chas Emerick의 훌륭한 스크린 캐스트 인 starting clojure을 따라 갔고 URL 단축키를 가져 와서 꽤 빨리 실행했습니다. 다음으로 문제가 발생했을 때 배포 할 수 있기를 원했습니다.상대 링크와 비 루트 컨텍스트 경로를 사용하여 Clojure 웹 응용 프로그램을 Jetty에 배포 할 때 깨진 링크

루트 웹 애플리케이션으로 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을 찾을 수 없다고 불평합니다. 이것은 상대 경로로 취급되지 않고 절대적인 것으로 간주된다는 것을 의미합니다.

제 질문은 다음과 같습니다. 어떻게 해결할 수 있습니까? 난 그냥 액션 링크에 전체 경로를 지정할 수있을 것 같아요,하지만 유연하지 않을 것이고 개발에서 서블릿을 실행하기가 더 힘들어 질 것입니다. 내 방식을 구성하는 방법이 있습니까? 또는 마술 URL 접두사 (예 : 면도기에서 ~/)가 올바른 작업을 수행 할 수 있습니까?

+0

당신은/예에서 해당 양식을 액세스하는 (물론, 그것은 나를 위해 한)

(POST "/shorten" request 

(POST "shorten" request 

와 그것을 작동합니다 : 줄을 변경? 액션에서 상대적인 경로이기 때문에 브라우저는 현재 URI로 우선해야합니다. 어쩌면 Firebug 또는 일부 HTTP 검사기를로드하고 리디렉션이 있는지 확인하십시오. – mqsoh

+0

예,/example ...에서 액세스 중이며 에있는 CSS 파일이 올바르게 전달되고 있습니다 (304 리디렉션을 통해) -하지만

작업은 그렇지 않습니다. – corvuscorax

+0

제출을 클릭하면 페이지 요청에 대한 리디렉션이 표시됩니까? 301에서/example/shorten to to/shorten? – mqsoh

답변

0

같은 문제가있었습니다.