教程:我想通过localhost打开一个文件,但我不知道在浏览器中输入哪条路径。是localhost,我的server.js所在的位置? (对不起,我是编程和节点的新手)
教程码
var path = require('path'),
fs = require('fs');
require('http').createServer(function(req, res) {
var file = path.normalize(req.url);
console.log(file);
path.exists(file, function(exists) {
if (exists) {
fs.stat(file, function(err, stat) {
var rs;
if (err) { throw err; }
if (stat.isDirectory()) {
res.writeHead(403);
res.end('Forbidden');
} else {
rs = fs.createReadStream(file);
res.writeHead(200);
rs.pipe(res);
}
});
} else {
res.writeHead(404);
res.end('Not found');
}
})
}).listen(4000);
答案 0 :(得分:2)
request.url
通常为/something/like/an/absolute/path
,除非您收到来自HTTP代理客户端的请求(将http://...
前缀添加到request.url
)或发出一些自定义HTTP请求。
无论如何path.normalize
只关注..
和.
。
您的代码将允许任何人访问您计算机上的任何文件(可由运行node
进程的帐户访问)。
更好/更安全的做法是将__dirname
与解码的request.url
连接,并检查解析路径是否以要从中提供静态内容的目录的绝对路径(带尾随路径分隔符)开始:
var scriptDir = path.resolve(__dirname + path.sep + "static" + path.sep),
requestPath = decodeURIComponent(request.url);
requestPath = path.resolve(path.join(__dirname, "static", requestPath));
if (requestPath.indexOf(scriptDir) === 0) {
// serve the file
} else {
response.writeHead(403);
response.end(http.STATUS_CODES[403]);
}
现在,如果您请求发言,http://localhost:4000/index.html
它应该提供/path/to/your/node/app/dir/static/index.html