所以我有一个非常简单的问题,目前我的服务器文件和HTML文档都存在于同一目录中。但是,我已经意识到这导致了一个非常烦人的问题。如果我是用户输入:
http://localhost:3000/HTML/homepage.html
服务器向他们提供HTML文档,通常他们必须通过登录,并在访问主页之前验证其会话ID。
有没有办法拒绝访问服务器目录中保存的文件?
我的代码当前运行的示例:
var http = require('http'),
fs = require('fs');
var path = require("path");
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser')
var session = require('express-session')
var sqlite3 = require('sqlite3').verbose();
var express = require('express');
var app = express();
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
app.use(bodyParser());
app.use(express.static(__dirname));
app.get('/signin', function (req, res) {
res.sendFile(path.join(__dirname + '/HTML/signin'));
});
app.post('/signin', function (req, res) {
var email = req.body.email;
var password = req.body.password;
if (email!="" || password != ""){
req.session.sessID = email //using email for example purposes
res.setHeader('Content-Type', 'application/json' );
res.send(JSON.stringify({
success: true //the client then catches the JSON, and will redirect to http://localhost:3000/homepage
}));
}
}
app.get('/homepage', function(req, res){
if (req.session.sessID == undefined){
res.send("You must login first!")
}else{
res.sendFile(path.join(__dirname + '/HTML/homepage.html'));
}
}
答案 0 :(得分:2)
问题的根源是:
app.use(express.static(__dirname));
这告诉express要提供它可以在你的硬盘驱动器上从app目录中找到的任何文件。这是不可取的。如果在浏览器中输入正确的路径,这甚至会提供您的私人服务器源代码文件。
您应该区分静态文件和动态处理的路由,并确保它们之间不存在冲突。
一个常见的设计是在硬盘驱动器上为静态HTML文件(而不是您的应用程序目录)指定一个单独的目录,然后设置快速静态路由到那里。并且,确保静态路由不会满足您的任何动态路由。
例如,如果静态HTML文件位于HTML
目录下的子目录__dirname
中,则可以执行此操作:
app.use(express.static(path.join(__dirname, "HTML")));
然后确保您的动态HTML文件(例如homepage.html)都不在该目录中(将它们放在express.static()
将看不到的其他地方)。
如果您实际上不希望用户能够看到除自定义路线之外的任何内容,那么请完全摆脱app.use(express.static(__dirname));
行,只为您正在服务的每个页面创建自定义路线。