2016-06-15 2 views
3

Я пытаюсь узнать о серверах, использующих Racket, и я нахожусь на пути к использованию статических активов. Из this answer, я был в состоянии включить статическую таблицу стилей, как так:Обслуживание статических файлов с использованием сервлетов 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)) 

Однако, я до сих пор путают о том, как сделать это в целом, то есть обслуживает все файлы в #:extra-files-paths без правила доставки для каждого из них. Я попробовал совет Джей и изменил порядок диспетчера в определении serve/servlet, переместив части htdocs и дополнительных файлов-путей (я, вероятно, не должен копировать все это здесь), и я нарушил способность разрешать типы MIME. В целом это был беспорядок.

Таким образом, любой из этих вопросов будут связаны/отношение к моей проблеме (от менее к более общим):

  1. Есть ли лучший способ включить статические файлы с помощью инструментов на уровне serve/servlet?

  2. Может ли кто-нибудь конкретно очертить, как я мог бы переставить фигуры в serve/servlet, не нарушая ничего?

  3. Есть ли лучшее место, чем документы, чтобы узнать, как использовать серверные инструменты нижнего уровня в Racket? (Я довольно нового в этой специфической области так «узнать больше о серверах» может быть правильным ответом на этот вопрос)

ответ

1

Он смотрит на меня, как проблема ваша #: сервлет-регулярное выражение, которое установите на пустое регулярное выражение, что означает, что оно будет соответствовать чему-либо. Одним из простых решений является ограничение этого регулярного выражения так, чтобы оно соответствовало нестационарным активам; то все остальные запросы должны обслуживаться из путей #: extra-files.

Возможно, есть причина, по которой вам нужно перехватывать все запросы и обрабатывать их в коде? Не уверен.

+0

Как выглядит соответствующее регулярное выражение? '#rx". * \. rkt "' кажется неправильным синтаксисом. 'read: неизвестная escape-последовательность \. in string' – Zelphir

+1

Да, это классическая проблема с двойным выходом; Ракетка (и большинство других языков) интерпретирует обратную косую черту как символ побега. Поскольку вам действительно нужна обратная косая черта в вашем регулярном выражении, вам нужно записать ее как #rx ". * \\. Rkt". Это ... двойная обратная косая черта. Посмотрим, сохранится ли эта строка при переполнении стека. –

Смежные вопросы