2016-06-15 8 views
3

私はRacketを使用しているサーバーについて学習しようとしています。静的資産を使用しようとしているのです。しかし、私はつまり、それぞれのディスパッチルールをせずに#:extra-files-paths内のすべてのファイルを提供し、一般的にこれを行う方法のようまだ混乱している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)) 

this answerから、私はそうのような静的なスタイルシートを含めることができましたそのうちの。私はJayのアドバイスを試して、serve/servletのhtdocsとextra-files-pathsの部分を上に移動してディスパッチャの順序を変更しました(私はおそらくそのすべてをここにコピーすべきではないでしょう)。全体的には混乱でした。

は、したがって、これらの質問のいずれかが(以下に、より一般的なものから)私の問題へ/関連関連することになります。

  1. serve/servletのレベルでのツールを使用して、静的ファイルをインクルードするより良い方法はありますか?

  2. どのように私はserve/servletの部分をどのように再編成するかもしれないかを具体的に説明できますか?

  3. ラケットの下位レベルのサーバーツールを使用する方法については、ドキュメントよりも優れた場所がありますか?サーブレット・正規表現、である:それは問題のように私には見えます

答えて

1

があなたの#である(私は、この特定の領域はと​​ても「サーバーの詳細を学ぶ」にかなり新たなんだ、この質問への有効な応答でもよいです)空のregexpに設定されます。つまり、何かにマッチします。 1つの簡単な解決策は、この正規表現を非静的資産にのみ一致するように制限することです。他のすべてのリクエストは、#:extra-files-pathsから提供されます。

おそらく、すべてのリクエストをインターセプトしてコード内で処理する必要がある理由がありますか?わからない。

+0

正規表現はどのようなものでしょうか? '#rx"。* \。rkt "'は間違った構文であるようです。 'read:未知のエスケープシーケンス\。文字列 ' – Zelphir

+1

はい、これは古典的なダブルエスケープの問題です。ラケット(および他のほとんどの言語)はバックスラッシュをエスケープ文字として解釈します。実際に正規表現にバックスラッシュが必要なので、#rx "。* \\。rkt"と書く必要があります。それはバックスラッシュを2倍にしたものです。その文字列がスタックオーバーフロー処理を引き継ぐかどうかを見てみましょう。 –

関連する問題