使用Racket servlet提供静态文件

时间:2016-06-15 21:40:34

标签: servlets server racket

我正在尝试使用Racket了解服务器,并且我开始尝试使用静态资产了。从this answer开始,我能够包含一个静态样式表,如下所示:

#lang racket

(require web-server/servlet
         web-server/servlet-env
         web-server/configuration/responders)

(define (home req)
  (response/xexpr
   '(html
     (head (link ([rel "stylesheet"] [type "text/css"] [href "/style.css"])))
     (body
      (span ([class "emph"]) "Hello, world!")))))

(define-values (dispatch input-url)
  (dispatch-rules
   [("home") home]
   [("style.css") (λ (_) (file-response 200 #"OK" "style.css"))]))

(serve/servlet dispatch
               #:servlet-regexp #rx""
               #:servlet-path "/home"
               #:server-root-path (current-directory))

但是,我仍然对如何执行此操作感到困惑,即为#:extra-files-paths中的所有文件提供服务而不为每个文件制定调度规则。我尝试了Jay的建议并通过移动htdocs和extra-files-paths部分来更改serve/servlet定义中的调度程序顺序(我可能不应该在这里复制整个内容)并且我破坏了解析MIME的能力不知何故的类型。总的来说这是一团糟。

因此,任何这些问题都与我的问题相关/相关(从少到一般):

  1. 是否有更好的方法可以使用serve/servlet级别的工具来包含静态文件?

  2. 任何人都可以详细说明如何在不破坏事物的情况下重新安排serve/servlet中的各个部分吗?

  3. 是否有比文档更好的地方了解如何在Racket中使用较低级别的服务器工具? (我在这个特定领域很新,所以“了解更多关于服务器”可能是对这个问题的有效回应)

1 个答案:

答案 0 :(得分:1)

在我看来问题就是你的#:servlet-regexp,它被设置为空的正则表达式,这意味着它将匹配任何东西。一个简单的解决方案是限制此正则表达式,使其仅匹配非静态资产;然后,所有其他请求应该从#:extra-files-paths。

提供

或许还有一些原因需要拦截所有请求并在代码中处理它们?不确定。