Servlets 使用Racket servlet服务静态文件

Servlets 使用Racket servlet服务静态文件,servlets,server,racket,Servlets,Server,Racket,我正在尝试学习使用Racket的服务器,我正在尝试使用静态资产。从中,我可以包含如下静态样式表: #lang racket (require web-server/servlet web-server/servlet-env web-server/configuration/responders) (define (home req) (response/xexpr '(html (head (link ([rel "styleshee

我正在尝试学习使用Racket的服务器,我正在尝试使用静态资产。从中,我可以包含如下静态样式表:

#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))
但是,一般来说,我仍然不知道如何做到这一点,即在
#:额外文件路径中为所有文件提供服务,而不为每个文件制定分派规则。我尝试了Jay的建议,在
service/servlet
的定义中更改了调度程序的顺序,将htdocs和额外文件路径部分向上移动(我可能不应该在这里复制整个内容),并以某种方式破坏了解析MIME类型的能力。总的来说,情况一团糟

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

  • 是否有更好的方法使用
    service/servlet
    级别的工具包含静态文件

  • 有人能具体地描述一下我如何在不破坏东西的情况下重新排列
    service/servlet
    中的各个部分吗

  • 有没有比文档更好的地方来学习如何使用Racket中的低级服务器工具?(我对这一特定领域相当陌生,因此“了解更多关于服务器的信息”可能是对这个问题的有效回答)


  • 在我看来,问题在于#:servlet regexp,它被设置为空regexp,这意味着它将匹配任何内容。一个简单的解决方案是限制这个regexp,使它只匹配非静态资产;然后,所有其他请求都应该从#:额外文件路径提供服务


    也许您需要拦截所有请求并在代码中处理它们是有原因的?不确定。

    合适的正则表达式是什么样的
    #rx“*\.rkt”
    似乎语法错误<代码>读取:未知转义序列\。在字符串中
    Yes,这是典型的双转义问题;Racket(和大多数其他语言)将反斜杠解释为转义字符。因为您实际上希望在regexp中使用反斜杠,所以需要将其写成#rx“*\\\.rkt”。那就是。。。将反斜杠加倍。让我们看看该字符串是否在堆栈溢出处理中幸存。