2012-01-07 11 views
1

スタティックファイルを処理しているシンプルなExpressサーバーがあります。私はindex.htmlと呼ばれるファイルを持っている私の公開ディレクトリにURLに末尾の円記号が含まれている場合、エクスプレスおよびスタティックミドルウェアを使用したノードクラッシュ

var express = require('express'); 
var app = express.createServer(); 

// Configuration 
app.configure(function() { 
    app.use(express.bodyParser()); 
    app.use(express.staticCache()); 
    app.use(express.static(__dirname + '/public')); 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

// 404 
app.get('*', function(req, res) { 
    res.send('not found', 404); 
}); 

app.listen(3000); 

:ここでは、サーバです。起動するnode app.jsし、localhost:3000/index.htmlを参照すると、期待どおりに静的ファイルが表示されます。 localhost:3000/indまたはlocalhost:3000/ind\に移動すると、期待通りに404ページが表示されます。

しかし、(末尾のバックスラッシュに注意)localhost:3000/index.html\に移動するには、と私のnodeサーバーをクラッシュ:

stream.js:105 
     throw er; // Unhandled stream error in pipe. 
     ^
Error: ENOENT, no such file or directory '/home/bill/projects/app/public/index.html\' 

なぜnodeサーバがクラッシュしているだけではなく404ページを提供しますか?私はファイルが存在しないので、静的ミドルウェアはそれをスキップして要求を経路に渡すと考えました。リクエストURLに末尾のバックスラッシュがある場合は404を返すカスタムミドルウェアを作成して周りに乗りましたが、ここで何か不足しているかどうか確認したいと思います。ありがとう!

答えて

1

この動作の理由は、末尾のバックスラッシュを処理する方法が、fs.statfs.createReadStreamと異なるためです。静的なミドルウェアの文字列'path/to/public/index.html\\'is given to fs.statが、それは無視されている場合

index.htmlという名前のファイルをコマンドライン判定にstat index.html\を実行している、あなたはindex.html\ためstat index.html\\を実行する必要があると思います)。だからfs.statは、あなたがindex.htmlを求めていると思ってファイルが見つかったと思って、次のミドルウェアハンドラを呼び出しません。

後でis passed to fs.createReadStreamとお考えの方はindex.html\とお考えください。そのファイルが見つからず、エラーがスローされます。

バックスラッシュを異なる方法で処理するため、実際には何もできませんが、ミドルウェアを使用してこれらの要求を除外します。

+0

これは接続時のバグです。カスタムミドルウェアを作成することはあまり意味がありません。特に攻撃の拒否サービスを非常に簡単に拒否するようになって以来、私はバグを報告します。ありがとう! – Bill

+0

この問題は、現在のConnectコードベースで修正されました。 – Bill

関連する問題