저는 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 접두사 (예 : 면도기에서 ~/
)가 올바른 작업을 수행 할 수 있습니까?
당신은/예에서 해당 양식을 액세스하는 (물론, 그것은 나를 위해 한)
와 그것을 작동합니다 : 줄을 변경? 액션에서 상대적인 경로이기 때문에 브라우저는 현재 URI로 우선해야합니다. 어쩌면 Firebug 또는 일부 HTTP 검사기를로드하고 리디렉션이 있는지 확인하십시오. – mqsoh
예,/example ...에서 액세스 중이며
에있는 CSS 파일이 올바르게 전달되고 있습니다 (304 리디렉션을 통해) -하지만제출을 클릭하면 페이지 요청에 대한 리디렉션이 표시됩니까? 301에서/example/shorten to to/shorten? – mqsoh