반지 경로를 사용하여 구현하려는 동작은 대략 this question에 설명되어 있습니다.누락 된 후행 슬래시 URL을 리디렉션하는 링 솔루션
는 기본적으로 나는 후행 슬래시로 끝나는 일부 URL이, 내가하고 경우에만 /foo/
가 유효한 URL과 /foo
가없는 경우 example.com/foo/
에 example.com/foo
을 예컨대에서 리디렉션하는 미들웨어를 만들려고 해요.
나는 현재이해야 거의 모든 수행이 미들웨어
(defn good-response? [resp]
(and resp (not= (:status resp) 404)))
(defn wrap-slash [handler]
(fn [{:keys [uri] :as req}]
(let [resp (handler req)]
(if (or (good-response? resp) (.endsWith "/" uri))
resp
(let [added-slash (str uri "/")]
(if (good-response? (handler (assoc req :uri added-slash)))
(redirect added-slash)
resp))))))
을 사용하고 있습니다 : 그것은 /foo/
이 존재하고 /foo
하지 않는 /foo
에서 /foo/
에 IFF에 리디렉션합니다.
이 솔루션을 사용하면 에 대한 요청에서 두 번 이상 (handler req)
을 요청하고 클라이언트가 리디렉션 된 URL을 요청한 경우 다시 한 번 호출 할 것입니다. 지금은 문제가 아니지만 수백 건의 DB 쿼리 또는 이와 같은 문제가있는 일부 느린 페이지의 응답 시간을 두 배로 늘리는 것은 힘든 일이라고 상상할 수 있습니다.
핸들러를 호출하지 않고 주어진 URL에 대한 핸들러가 존재하는지 단순히 확인하는 방법이 있습니까? (:body request)
을 게으르게 만들면 완전히 문제를 피할 수 있을까요?