Clojure 在Compojure中提供静态favicon文件

Clojure 在Compojure中提供静态favicon文件,clojure,compojure,Clojure,Compojure,根据: 默认情况下,Compojure不提供静态文件,也不提供静态文件 当没有路线匹配时,自动处理404 所以为了解决这个问题,我们必须设置这些 档案 找不到 资源 这就是我们目前的设置方式: (defroutes app-routes (route/files "/" {:root "path/to/public"}) (route/resources "/") (route/not-found "Not Found")) 当大多数静态文件都是通过web浏览器访问时,它就如预

根据:

默认情况下,Compojure不提供静态文件,也不提供静态文件 当没有路线匹配时,自动处理404

所以为了解决这个问题,我们必须设置这些

  • 档案
  • 找不到
  • 资源
这就是我们目前的设置方式:

(defroutes app-routes
  (route/files "/" {:root "path/to/public"})
  (route/resources "/")
  (route/not-found "Not Found"))
当大多数静态文件都是通过web浏览器访问时,它就如预期的那样工作了

e、 g

但问题是,它对favicon文件不起作用。

e、 g

它将此视为一个不同的调用,它应该作为一个静态文件

对我运行的
CURL的响应:

* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 3000 (#0)
> GET /img/favicon.ico HTTP/1.1
> User-Agent: curl/7.38.0
> Host: localhost:3000
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 28 Jul 2015 19:05:24 GMT
< Last-Modified: Thu, 28 May 2015 14:51:16 +0000
< Content-Length: 1106
< Content-Type: image/x-icon
* Server Jetty(7.6.13.v20130916) is not blacklisted
< Server: Jetty(7.6.13.v20130916)
在DNS缓存中找不到主机名 *正在尝试127.0.0.1。。。 *已连接到本地主机(127.0.0.1)端口3000(#0) >GET/img/favicon.ico HTTP/1.1 >用户代理:curl/7.38.0 >主机:localhost:3000 >接受:*/* >
文件
资源
未找到
是函数,而不是您设置的变量。当您调用
(route/files”/“{:root”path/to/public”})
时,将返回将“/”下的URL解析为“path/to/public”下的静态文件的路由

defroutes
定义路由集合。这些路由将按照它们列出的顺序进行尝试,直到第一个返回响应为止

如果您在其他路由之前添加一个路由
(GET“/:slug”[*:as req slug](search req slug))
,则“/”以外的任何URL都将由该新路由处理,包括favicon请求。另一方面,如果您在
未找到
路由之前添加它,那么它应该可以工作

此外,如果没有与请求匹配的静态文件,则
文件
路由将失败,并将尝试下一个路由。因此,您还应该检查
favicon.ico
是否确实存在,是否在
img
子目录中。

这适用于我(无论您在何处定义/声明路线):

在名称空间部分:

            [ring.util.response :refer [resource-response]]
低于(至少高于)(def应用程序):

然后在:

(def app
  (-> routes
      ...
      wrap-return-favicon
      wrap-stacktrace))

将响应粘贴到
curl-vvvhttp://localhost:3000/img/favicon.ico
please@JamesSharp我已经发布了回复。看起来还可以…为什么你说它不工作?如果你用浏览器进行测试,它的缓存可能会出错,但它与compojure无关。有一个它加载favicon,但当我说它不工作时,我会ean的
compojure
“我相信”并没有将其作为静态文件使用,而是将其视为
路由之一
。因此,它似乎属于以下路由:
(GET”/:slug“[*:as req slug](search req slug))
感谢您澄清这一点。奇怪的是,它确实存在于
img
目录中,但仍由
/:slug
路由处理,而同一目录中的图像则不存在。
(def app
  (-> routes
      ...
      wrap-return-favicon
      wrap-stacktrace))