Служите index.html в / по умолчанию в Compojure - PullRequest
29 голосов
/ 11 октября 2011

У меня есть статический файл с именем index.html, который я хотел бы использовать, когда кто-то запрашивает /. Обычно веб-серверы делают это по умолчанию , но Compojure этого не делает. Как я могу заставить Compojure служить index.html, когда кто-то запрашивает /?

Вот код, который я использую для статического каталога:

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

Ответы [ 8 ]

39 голосов
/ 11 октября 2011

Альтернативой может быть создание перенаправления или прямого ответа в дополнительном маршруте.Примерно так:

(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] импорт

26 голосов
/ 11 апреля 2013
(ns compj-test.core
  (:use [compojure.core])
  (:require
        [ring.util.response :as resp]))

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

То, что вы просите, - это перенаправление из / в /index.html. Это так же просто, как (соответственно / цель перенаправления) . Не нужно слишком усложнять вещи.

21 голосов
/ 11 октября 2011

Это было бы довольно простым кольцевым промежуточным ПО:

(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)))
19 голосов
/ 05 октября 2013

Это работает просто отлично. Не нужно писать кольцевое промежуточное изделие.

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

(defroutes app-routes 
(GET "/" [] (io/resource "public/index.html")))
9 голосов
/ 10 сентября 2015

После просмотра множества ответов здесь я использую следующий код:

(ns app.routes
  (:require [compojure.core :refer [defroutes GET]]
            [ring.util.response :as resp]))

(defroutes appRoutes
  ;; ...
  ;; your routes
  ;; ...
  (GET "/" []
       (resp/content-type (resp/resource-response "index.html" {:root "public"}) "text/html"))))
  • Без перенаправлений;
  • Нет необходимости в другом промежуточном программном обеспечении;
  • index.html находится в нужной папке (resources / public / index.html);
  • Работает с другим промежуточным ПО (многие ответы ломаются при использовании с некоторым промежуточным ПО по умолчанию);
  • Он предоставляет тип контента, поэтому он работает с промежуточным программным обеспечением типа wrap-content.

Проверка по умолчанию для кольца .Он имеет лучшее программное обеспечение, которое вы должны использовать в своих проектах.

3 голосов
/ 24 декабря 2012

Недавно я обнаружил, что ответ @ amalloy не работает, когда приложение Clojure / Compojure работает под Jetty или Tomcat как .war.В этом случае :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

ОБНОВЛЕНО: Замененный примерс версией, которая работает.

1 голос
/ 25 июня 2015

когда другой код не работает, попробуйте этот код.

(GET "/about/" [] (ring.util.response/content-type
                     (ring.util.response/resource-response "about/index.html" {:root "public"}) "text/html"))
0 голосов
/ 04 марта 2014

Просто соображение, Бинита, гоча, которую я испытывала. Несмотря на то, что я не смог найти никакой документации относительно важности порядка определения маршрутов Compojure, я обнаружил, что это не работает

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

пока это работает

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

Очевидно, что * соответствует также пустой строке, но я подумал, что порядок не должен иметь никакого значения.

...