在Compojure中默认为/默认提供index.html

时间:2011-10-11 16:52:56

标签: clojure compojure

我有一个名为index.html的静态文件,我想在有人请求/时提供该文件。通常是Web服务器do this by default,但Compojure却没有。当有人请求index.html时,如何让Compojure服务/

这是我用于静态目录的代码:

; match anything in the static dir at resources/public
(route/resources "/")

7 个答案:

答案 0 :(得分:39)

另一种方法是在附加路线中创建重定向或直接响应。像这样:

(ns compj-test.core
  (:use [compojure.core])
  (:require [compojure.route :as route]
            [ring.util.response :as resp]))

(defroutes main-routes
  (GET "/" [] (resp/file-response "index.html" {:root "public"}))
  (GET "/a" [] (resp/resource-response "index.html" {:root "public"}))
  (route/resources "/")
  (route/not-found "Page not found"))

“/”路由返回公共文件夹中存在的“index.html”文件响应。 “/ a”路由直接通过'内联'文件index.html来响应。

有关响铃的更多信息:https://github.com/mmcgrana/ring/wiki/Creating-responses

编辑:删除了不必要的[ring.adapter.jetty]导入。

答案 1 :(得分:26)

(ns compj-test.core
  (:use [compojure.core])
  (:require
        [ring.util.response :as resp]))

(defroutes main-routes
  (GET "/" [] (resp/redirect "/index.html")))

您要求的是从/到/index.html的重定向。它就像(resp / redirect target)一样简单。不需要过于复杂化。

答案 2 :(得分:21)

这将是一个非常简单的Ring中间件:

(defn wrap-dir-index [handler]
  (fn [req]
    (handler
     (update-in req [:uri]
                #(if (= "/" %) "/index.html" %)))))

使用此功能封装您的路线,并在您的代码的其余部分看到之前,/的请求转换为/index.html的请求。

(def app (-> (routes (your-dynamic-routes)
                     (resources "/"))
             (...other wrappers...)
             (wrap-dir-index)))

答案 3 :(得分:19)

这很好用。无需编写环形中间件。

(:require [clojure.java.io :as io])

(defroutes app-routes 
(GET "/" [] (io/resource "public/index.html")))

答案 4 :(得分:3)

最近我发现,当Clojure / Compojure应用程序在Jetty或Tomcat下作为.war运行时,@ amalloy的答案不起作用。在这种情况下,:path-info需要更新。此外,我认为这个版本将处理任何路线,而不仅仅是“根”路线。

(defn- wrap-dir-index [handler]
  (fn [request]
    (handler
     (let [k (if (contains? request :path-info) :path-info :uri) v (get request k)]
       (if (re-find #"/$" v)
         (assoc request k (format "%sindex.html" v))
         request)))))

另请参阅:https://groups.google.com/forum/#!msg/compojure/yzvpQVeQS3w/RNFkFJaAaYIJ

更新:将示例替换为有效的版本。

答案 5 :(得分:1)

当其他代码不起作用时 试试这段代码。

(GET "/about/" [] (ring.util.response/content-type
                     (ring.util.response/resource-response "about/index.html" {:root "public"}) "text/html"))

答案 6 :(得分:0)

只是考虑Binita,我一直在体验的问题。尽管我找不到任何有关定义Compojure路线的顺序重要性的文档,但我发现这不起作用

(GET "/*" [] r/static) 
(GET "/" [] (clojure.java.io/resource "public/index.html"))

虽然这确实有效

(GET "/" [] (clojure.java.io/resource "public/index.html"))
(GET "/*" [] r/static) 

显然*也匹配空字符串,但我认为顺序根本不重要。