servlets之使用 Racket servlet 提供静态文件

zdz8207 阅读:91 2025-05-04 20:05:19 评论:0

我正在尝试使用 Racket 了解服务器,并且我正在尝试使用静态 Assets 。来自 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 的建议并更改了 serve/servlet 定义中的调度程序顺序通过将 htdocs 和 extra-files-paths 部分向上移动(我可能不应该在这里复制整个内容),我以某种方式破坏了解析 MIME 类型的能力。总的来说是一团糟。

因此,这些问题中的任何一个都与我的问题相关/相关(从较少到较一般):
  • 是否有更好的方法使用 serve/servlet 级别的工具来包含静态文件? ?
  • 谁能具体概述我如何重新排列 serve/servlet 中的片段不破坏东西?
  • 有没有比文档更好的地方来了解如何在 Racket 中使用较低级别的服务器工具? (我在这个特定领域很新,所以“了解有关服务器的更多信息”可能是对这个问题的有效回答)
  • 请您参考如下方法:

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

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


    标签:Servlet
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号